2011-09-14 5 views
0

J'ai cherché autour et je suis à ma fin d'esprit alors je vais rendre cela facile. Voilà ce que j'ai dans un print_r:Groupe tableau par les clés valeur

Array 
(
    [0] => Array 
     (
      [name] => client interaction 
      [y] => 2.7 
     ) 

    [1] => Array 
     (
      [name] => client interaction 
      [y] => 0.1 
     ) 

    [2] => Array 
     (
      [name] => project planning 
      [y] => 0.1 
     ) 

    [3] => Array 
     (
      [name] => client interaction 
      [y] => 5.9 
     ) 

) 

Et voici ce que je veux que ce soit:

Array 
(
    [0] => Array 
     (
      [name] => client interaction 
      [y] => 8.7 
     ) 

    [1] => Array 
     (
      [name] => project planning 
      [y] => 0.1 
     ) 

) 
+0

Il n'y a pas un "moyen facile".Juste itérer sur le tableau original, et construire un autre tableau d'indexé par nom. – Candide

Répondre

2
$hash = array(); 
foreach ($sourceArray as $key=>$value) { 
    $y = 0; 
    if (isset($hash{$value{'name'}})) { 
     $y = $hash{$value{'name'}}; 
    } 

    $hash{$value{'name'}} = $y + $value{'y'}; 
} 

$result = array(); 
foreach ($hash as $key => $value) { 
    $result[] = array('name' => $key, 'value' => $value); 
} 
print_r($result); 

La dernière boucle est juste pour obtenir $hash dans le format exact que vous avez spécifié .


Explication:

$hash 

est une structure temporaire utilisée pour calculer les sommes pour chaque nom unique. Cela traverse votre tableau d'origine ($ sourceArray) et extrait chaque élément. Initialise une variable pour stocker la somme en cours qui appartient à ce nom.

$y = 0; 

Initialise une variable pour stocker la somme actuelle qui appartient à ce nom.

if (isset($hash{$value{'name'}})) { 

Vérifie si une valeur a déjà été stocké dans $hash le nom donné.

 $y = $hash{$value{'name'}}; 
    } 

Définit $ y à la somme précédemment calculée pour le prénom, s'il y en avait une.

$hash{$value{'name'}} = $y + $value{'y'}; 
} 

Stocke la somme pour le nom donné dans notre structure temporaire $hash.

$result = array(); 
    foreach ($hash as $key => $value) { 
     $result[] = array('name' => $key, 'value' => $value); 
    } 

convertit $ hash au format souhaité. Les empy [] en $result[] = ... ajoutent le côté droit de l'expression à la fin du tableau $result.

+0

Salut. Ne semble-t-il pas que les opérandes de cette ligne sont inversés? '$ y = $ hash {$ value {'name'}};' Je pense que vous vouliez dire '$ hash {$ value {'name'}} = $ y;' –

+0

non, c'est correct. Cette ligne initialise y à ce qui a été vu précédemment pour l'addition sur la ligne suivante. –

+0

Ahhh .. Merci. Je pensais avoir vu un '! Isset' +1 –

4

Est-il absolument nécessaire que votre tableau désiré utilise des indeces numériques? Si je devais le faire, je le ferais de cette façon (pas le même que votre tableau désiré si)

$newArray = array(); 
foreach($array as $item) 
{ 
    if(!isset($newArray[$item["name"]])) 
    $newArray[$item["name"]] = 0; 

    $newArray[$item["name"]] += $item["y"]; 
} 

Cela vous donnera un tableau de cette structure:

Array 
(
    [client interaction] => 8.7 
    [project planning] => 0.1 
) 

Pour obtenir les clés retour vous utilisez simplement la deuxième forme de la boucle foreach

foreach($newArray as $name => $y) 

$name contiendra le name et $y le y dans votre tableau d'origine.

0
$mixed = array(); // Should contain your array shown above 
$groups = array(); 
$newArray = array(); // Will contain your new array 
$counter = 0; 

foreach($mixed as $mix) 
{ 
    if (isset($groups[$mix['name']])) 
    { 
     $newArray[$groups[$mix['name']]]['y'] += $mix['y']; 
    } 
    else 
    { 
     $groups[$mix['name']] = $counter; 
     $newArray[] = $mix; 
     $counter++; 
    } 
} 

http://codepad.org/EjdHxgvt

Questions connexes