Grupo de matriz por valor de claves

He buscado y estoy en mi ingenio, así que lo haré fácil. Esto es lo que tengo en print_r:

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 ) ) 

Y esto es lo que quiero que sea:

 Array ( [0] => Array ( [name] => client interaction [y] => 8.7 ) [1] => Array ( [name] => project planning [y] => 0.1 ) ) 

¿Es absolutamente necesario que tu matriz deseada use indeces numéricos? Si tuviera que hacer esto, lo haría de esta manera (no es lo mismo que su matriz deseada)

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

Esto le dará una matriz de esta estructura:

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

Para recuperar las claves, simplemente usa la segunda forma del ciclo foreach

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

$name contendrá el name y $y el y en tu matriz original.

 $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); 

El último ciclo es solo para obtener $hash en el formato exacto que especificó.


Explicación:

 $hash 

Es una estructura temporal utilizada para calcular las sums de cada nombre único.

 foreach ($sourceArray as $key=>$value) { 

Esto pasa por su matriz original ($ sourceArray) y extrae cada elemento.

  $y = 0; 

Inicializa una variable para almacenar la sum actual que pertenece con ese nombre.

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

Comprueba si ya se ha almacenado un valor en $hash para el nombre de stack.

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

Establece $ y a la sum previamente calculada para el nombre de stack, si es que existía.

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

Almacena la sum del nombre de stack en nuestra estructura temporal $hash .

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

convierte $ hash al formato que desea.

El empy [] ‘s en $result[] = ... agrega el lado derecho de la expresión al final de la matriz $result .

 $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