Объединение многомерных массивов

153
23 августа 2021, 17:40

Есть массив

$arr1[] = array("id"=>"1", "count"=>"0", "otd"=>"south");
$arr1[] = array("id"=>"2", "count"=>"4", "otd"=>"north");
$arr1[] = array("id"=>"3", "count"=>"8", "otd"=>"south");

и второй массив:

$arr2[] = array("id"=>"1", "count"=>"1", "otd"=>"south");
$arr2[] = array("id"=>"2", "count"=>"3", "otd"=>"north");
$arr2[] = array("id"=>"3", "count"=>"5", "otd"=>"south");

У условных пользователей в этом массивe совпадают id, но count разный. Как можно сделать третий массив результирующий?(Суммируются count) Я пробовал при помощи array_merge, но второй массив просто дозаписывался в конец

arr3[1] => Array
        (
            [id] => 1
            [count] => 1   //0+1
            [otd] => south
        )
arr3[2] => Array
        (
            [id] => 2
            [count] => 7    //3+4
            [otd] => north
        )
arr3[3] => Array
        (
            [id] => 3
            [count] => 13    //5+8
            [otd] => south
        )

И вот еще, что интересно. Если переименую второй ключ в массиве и массивы будут такими:

$arr1[] = array("id"=>"1", "count"=>"0", "otd"=>"south");
$arr1[] = array("id"=>"2", "count"=>"4", "otd"=>"north"); 
$arr1[] = array("id"=>"3", "count"=>"8", "otd"=>"south");
$arr2[] = array("id"=>"1", "not_count"=>"1", "otd"=>"south");
$arr2[] = array("id"=>"2", "not_count"=>"3", "otd"=>"north");
$arr2[] = array("id"=>"3", "not_count"=>"5", "otd"=>"south");

Как можно получить массив такого вида?

 arr3[1] => Array
            (
                [id] => 1
                [count] => 0  
                [otd] => south
                [not_count] => 1
            )
arr3[2] => Array
        (
            [id] => 2
            [count] => 3   
            [otd] => north
            [not_count] => 4
        )
arr3[3] => Array
        (
            [id] => 3
            [count] => 5 
            [otd] => south
            [not_count] => 8
        )

Пробовал сделать слияние, но [not_count] записывался поверх [count] первого массива с новым значением

Answer 1
<?php
$arr1= array(array("id"=>"1", "count"=>"0", "otd"=>"south"),
array("id"=>"2", "count"=>"4", "otd"=>"north"),
array("id"=>"3", "count"=>"8", "otd"=>"south"));
$arr2 = array(array("id"=>"1", "count"=>"1", "otd"=>"south"),
array("id"=>"2", "count"=>"3", "otd"=>"north"),
array("id"=>"3", "count"=>"5", "otd"=>"south"));
foreach ($arr1 as $key => $value) {
    # code...
foreach ($arr2 as $key1 => $value1) {
    # code...
if($value['id']==$value1['id']){
 $data[]=array('id'=>$value['id'], 'count'=>$value['count']+$value1['count'], 'otd'=>$value['otd']); 
}
}
}
print_r($data);
?>
Answer 2

если учесть, что со второго массива вам по id надо вытащить count, то сначала приведите его к такому виду

$arr2 = array_column($arr2, 'count', 'id');

тогда id станут ключами, а count значениями

далее преобразуйте первый массив, пройдясь по нему и прибавляя значения второго по id

$result = array_map(function($v) use ($arr2){
                   $v['count'] += $arr2[$v['id']];
                   return $v; 
                }, $arr1);

а если порядок значений в массивах одинаков, и их число идентично, можно и еще проще, сразу испоьзовать map

$result = array_map(function($a, $b){
                    $a['count'] += $b['count'];
                    return $a; 
             }, $arr1, $arr2);
READ ALSO
Передать значение URL в Iframe

Передать значение URL в Iframe

Есть сайтСделана костылем отправка формы(СМS древняя)

182
Регистрация и авторизация в мобильном приложении, подходит ли для этого RESTfull

Регистрация и авторизация в мобильном приложении, подходит ли для этого RESTfull

Как правильно реализовать регистрацию и авторизацию в мобильном приложении, подходит ли для этого RESTful веб приложение, какой протокол для...

95
Не понимаю условие задачи

Не понимаю условие задачи

Решил доделать задачи, которые раньше не осилилНо до сих пор не могу понять 2-е условие

134
Не отображается микросервис на другом сервере

Не отображается микросервис на другом сервере

Возникла проблема с переходом с монолитного проекта на ммикросервисную архитектуруЕсть несколько сервисов которые будут распологаться...

117