PHP - foreach не меняет изначальный массив

После перебора изначальный массив $orders не изменяется.

foreach ($orders as $order) {
    foreach ($cart as $cartItem) {
        if ($order['session_id'] == $cartItem['session_id']) {
            $order['items'] = [];
            array_push($order['items'], $cartItem['good_id'], $cartItem['good_count']);
        }
    }
}

Может это как-то связано с вложенностью циклов?


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

Автор решения: Roman Grinyov

В вашем случае нужно использовать передачу по ссылке (as &$order):

foreach ($orders as &$order) {
    foreach ($cart as $cartItem) {
        if ($order['session_id'] == $cartItem['session_id']) {
            $order['items'] = [];
            array_push($order['items'], $cartItem['good_id'], $cartItem['good_count']);
        }
    }
}

https://php.net/language.references.pass

→ Ссылка
Автор решения: Veniamin

Дело в том, что в момент перебора массива foreach PHP копирует объект order в каждом цикле, а посему нельзя просто взять и изменить значение для него. Можно действительно перебирать массив по ссылки как было уже сказано, но также можно непосредственно заносить изменения в изначальный массив как-то так:

// вариант 1 - изменяем изначальный массив
foreach ($orders as $key => $order) {
  $orders[$key]['items'] =  []; 
}

// вариант 2 - используем перебор по ссылке
foreach ($orders as &$order) {
  $order['items'] =  []; 
}

Во втором варианте не происходит копирование объекта, а используется ссылка на объект, который находится в массиве.

→ Ссылка