DANAB
@DANAB
Junior PHP Developer

Как объединить многомерный массив?

Есть массив вида
Array
(
    [0] => Array
        (
            [id] => 292
            [num] => 2
        )
    [1] => Array
        (
            [id] => 291
            [num] => 5
        )
    [2] => Array
        (
            [id] => 292
            [num] => 7
        )
    [3] => Array
        (
            [id] => 291
            [num] => 1
        )
)

Нужно получить объединить массив внутри, по id. И получить:
Array
(
    [0] => Array
        (
            [id] => 292
            [num] => 9
        )
    [1] => Array
        (
            [id] => 291
            [num] => 6
        )
)

Подскажите пожалуйста, как это сделать?
Пробовал вот так, но теперь не могу придумать как значения num сложить:
$arr_id=array();
             foreach($row as $key=>$val){
                  if(array_search($row[$key]['entry_id'], $arr_id)===false){
                          $product[]=$row[$key];
                          $arr_id[]=(int)$row[$key]['entry_id'];
                  }else{
                           $product[]=$row[$key];
                  }
                }
  • Вопрос задан
  • 3162 просмотра
Решения вопроса 1
@Centrino
$arr_id = [];
foreach ($row as $value) {
       if (isset($arr_id[$value['id']])) {
                $arr_id[$value['id']]  += $value['num'];
                continue;
       }
       $arr_id[$value['id']] = $value['num'];
}
$row = [];
foreach ( $arr_id as $key => $value) {
        $row[] = [
                'id' => $key;
                'num' => $value;
        ];
}

Можно красивее, но это как быстрый пример.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mr_T
@mr_T
Web-разработчик
Можно, короче, по пацану сделать, вот так

$result = array_reduce($input, function($acc, $i) {
	if (isset($acc[$i['id']])) $acc[$i['id']]['num'] += $i['num'];
	else $acc[$i['id']] = $i;
	return $acc;
}, array());

// если нужен неассоциативный массив
$result = array_values($result);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы