Я получил многомерный массив следующим образом:
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) }