Intereting Posts

суммировать определенные значения в многомерном массиве (php)

Я получил многомерный массив следующим образом:

Totalarray ( [0] => Array ( [city] => NewYork [cash] => 1000 ) [1] => Array ( [city] => Philadelphia [cash] => 2300 ) [2] => Array ( [city] => NewYork [cash] => 2000 ) ) 

и я хотел бы суммировать значение [cash] суб-массивов, которые получили одинаковое значение [city] и получить такой массив:

 Totalarray ( [0] => Array ( [city] => NewYork [cash] => 3000 ) [1] => Array ( [city] => Philadelphia [cash] => 2300 ) ) 

Как мне это сделать?

Попробуйте под кодом:

 <?php $arr = array( array('city' => 'NewYork', 'cash' => '1000'), array('city' => 'Philadelphia', 'cash' => '2300'), array('city' => 'NewYork', 'cash' => '2000'), ); $newarray = array(); foreach($arr as $ar) { foreach($ar as $k => $v) { if(array_key_exists($v, $newarray)) $newarray[$v]['cash'] = $newarray[$v]['cash'] + $ar['cash']; else if($k == 'city') $newarray[$v] = $ar; } } print_r($newarray); 

Вывод:

 Array ( [NewYork] => Array ( [city] => NewYork [cash] => 3000 ) [Philadelphia] => Array ( [city] => Philadelphia [cash] => 2300 ) ) 

Демоверсия:
http://3v4l.org/D8PME

Используйте функцию array_reduce() для объединения элементов, имеющих один и тот же city :

 $input = array( array('city' => 'NewYork', 'cash' => '1000'), array('city' => 'Philadelphia', 'cash' => '2300'), array('city' => 'NewYork', 'cash' => '2000'), ); $output = array_reduce( // Process the input list $input, // Add each $item from $input to $carry (partial results) function (array $carry, array $item) { $city = $item['city']; // Check if this city already exists in the partial results list if (array_key_exists($city, $carry)) { // Update the existing item $carry[$city]['cash'] += $item['cash']; } else { // Create a new item, index by city $carry[$city] = $item; } // Always return the updated partial result return $carry; }, // Start with an empty list array() ); 

Использование не более одного цикла (или функции циклирования) для суммирования значений неэффективно.

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

Код: ( Демо )

 $array=[ ['city'=>'NewYork','cash'=>'1000'], ['city'=>'Philadelphia','cash'=>'2300'], ['city'=>'NewYork','cash'=>'2000'] ]; foreach($array as $a){ if(!isset($result[$a['city']])){ $result[$a['city']]=$a; // instantiate temporary city-keyed result array (avoid Notices) }else{ $result[$a['city']]['cash']+=$a['cash']; // add current value to previous value } } var_export(array_values($result)); // remove temporary keys 

Попробуй это:

  $sumArray = array(); foreach ($arrTotal as $k=>$subArray) { foreach ($subArray as $id=>$value) { $sumArray[$subArray['city']]+=$value; } } var_dump($sumArray); 

Вывод:

 array(2) { ["NewYork"]=> int(3000) ["Philadelphia"]=> int(2300) }