Как правильно заменить значение из подмассива?

Задача состоит в том, чтобы заменить значение из массива $array1['app_id'] = 5, если $array1['id'] равен с $array2['id']

$array1 = [
        [
            'id' => 1,
            'app_id' => 0
        ],
        [
            'id' => 2,
            'app_id' => 0
        ],
        [
            'id' => 3,
            'app_id' => 0
        ],
        [
            'id' => 4,
            'app_id' => 0
        ]
    ];

$array2 = [
        [
            'id' => 1
        ],
        [
            'id' => 2
        ]
    ];

foreach ($array1 as $arr1)
{
    foreach ($array2 as $arr2)
    {
        if ($arr1['id'] == $arr2['id'])
        {
            $arr1['app_id'] = 5;
        }
        else
        {
            $arr1['app_id'] = 6;
        }
    }

    $res[] = $arr1;
}

var_dump($res);

В данном примере результат ответа должен быть такой массив:

array(4) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1)
    ["app_id"]=>
    int(5)
  }
  [1]=>
  array(2) {
    ["id"]=>
    int(2)
    ["app_id"]=>
    int(5)
  }
  [2]=>
  array(2) {
    ["id"]=>
    int(3)
    ["app_id"]=>
    int(6)
  }
  [3]=>
  array(2) {
    ["id"]=>
    int(4)
    ["app_id"]=>
    int(6)
  }
}

Но вместо нее возвращаются другие значения app_id :(


Ответы (1 шт):

Автор решения: Yakoffka

Если я правильно Вас понял, то Вам необходимо в цикле менять значения массива не $arr1, а $array1 (или передавать значение $arr1 по ссылке).

$a2 = array_column($array2, 'id');
var_dump($a2);
foreach ($array1 as $k => $a1) {
    if (in_array($a1['id'], $a2, true)) {
        $array1[$k]['app_id'] = 5;
    } else {
        $array1[$k]['app_id'] = 6;
    }
}

var_dump($array1);

И вдобавок, для того, чтобы избавиться от вложенных foreach, можно получить массив значений из столбца 'id' второго массива, и проверять совпадения с помощью in_array().

→ Ссылка