Групповой массив по значению ключей

Я искал вокруг, и я нахожусь на своем пути, поэтому я сделаю это легко. Это то, что у меня есть в 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 ) ) 

И я хочу, чтобы это было так:

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

Это абсолютно необходимо, чтобы ваш желаемый массив использовал числовые индексы? Если бы я сделал это, я сделал бы это так (не то же самое, что и ваш желаемый массив)

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

Это даст вам массив этой структуры:

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

Чтобы получить ключи назад, вы просто используете вторую форму цикла foreach

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

$name будет содержать name и $y y в исходном массиве.

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

Последний цикл состоит только в том, чтобы получить $hash в точный формат, который вы указали.


Объяснение:

 $hash 

Является временной структурой, используемой для вычисления сумм для каждого уникального имени.

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

Это проходит через ваш исходный массив ($ sourceArray) и вытаскивает каждый элемент.

  $y = 0; 

Инициализирует переменную для хранения текущей суммы, которая принадлежит этому имени.

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

Проверяет, было ли значение уже сохранено в $hash для данного имени.

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

Устанавливает $ y в ранее рассчитанную сумму для данного имени, если таковой был.

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

Сохраняет сумму для данного имени в нашу временную структуру $hash .

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

преобразует $ хэш в желаемый формат.

Значение empy [] в $result[] = ... добавляет правую часть выражения в конец массива $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