2016-06-25 1 views
2

Je dispose de plusieurs tableaux comme ceci:Selon les valeurs dans le tableau la valeur clé en php

$value1 = array ("10" => "car", "20" => "home", "30" => "ball"); 
$value2 = array ("50" => "car", "60" => "home", "70" => "ball"); 
$value3 = array ("100" => "car", "110" => "home", "120" => "ball"); 

Maintenant, je veux fusionner ces tableaux par la valeur et lors de la fusion en ajoutant les valeurs clés ensemble.

Code Pseudo:

$endvalue = $value1 + $value2 + $value3; 

print_r ($endvalue); 

Sortie prévue:

"160" => "car" 
"190" => "home" 
"220" => "ball" 

J'ai une base de données comme celui-ci;

 
name facebookCount tweetCount googleCount 

car 20    50   100 
home 50    60   10 
ball 30    10   70 

.. et je veux trouver la valeur la plus partagée ..

Comme;

voiture (20 + 50 + 100)

maison (60 + 50 + 10)

balle (30 + 10 + 70)

..et liste

voiture

> accueil> balle

Pouvez-vous m'aider?

+1

Et que faites-vous lorsque vous obtenez deux clés en double? Vous ne pouvez pas avoir de clés en double. – Rizier123

+0

J'ai une base de données comme; nom - facebookcount - tweetcount - googlecount voiture 20 50 100 50 60 maison 10 maison 30 10 70 ..et Je veux apprendre au total au nombre de noms – serhatgksu

+2

PHP ne peut pas avoir les clés en double dans un tableau. Donc, vous devez penser à ce que vous voulez faire quand cela se produit. – Rizier123

Répondre

2

La solution pour les tableaux d'entrée avec clés non double utilisant array_values, array_combine et array_search fonctions:

... 
$arrList = [$value1, $value2, $value3]; // wrapping input arrays with outer array 
$names = array_combine(array_values($value1), array_fill(0, count($arrList), 0)); // getting base names list 

foreach ($names as $k => &$num) { 
    foreach ($arrList as $arr) { 
     $num += (int) array_search($k, $arr); 
    } 
} 

print_r($names); 

Je crois que le tableau final devrait être un tableau associatif, parce qu'il pourrait y avoir des cas où le total des sommes seront les mêmes parmi les noms regroupés

la sortie:

Array 
(
    [car] => 160 
    [home] => 190 
    [ball] => 220 
) 
+0

merci beaucoup. Cela fonctionne pour moi. – serhatgksu

+0

Mais vous aurez des problèmes lorsque les chiffres sont les mêmes pour facebook et twitter. – trincot

+0

@trincot, que voulez-vous dire? – RomanPerekhrest

2

Une solution SQL serait probablement plus rapide dans votre cas, et en fait très simple. L'arithmétique simple n'est pas un problème pour SQL.

Tenir compte d'une table avec la structure suivante:

 
CREATE TABLE `social` (
    `name` varchar(50) NOT NULL, 
    `facebook` int(11) NOT NULL, 
    `twitter` int(11) NOT NULL, 
    `google` int(11) NOT NULL, 
    PRIMARY KEY (`name`) 
); 

Ensuite, cette requête:

SELECT name, (facebook + twitter + google) as shares FROM social 
ORDER BY shares DESC 

vous donne le résultat suivant:

 
name shares 
car  170 
home 120 
ball 110 

Pas grand chose à expliquer, je suppose, mais n'hésitez pas à demander si quelque chose n'est pas clair.

+0

Merci pour vos réponses. – serhatgksu