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']);
}
}
}
Автор решения: Veniamin
→ Ссылка
Дело в том, что в момент перебора массива foreach PHP копирует объект order в каждом цикле, а посему нельзя просто взять и изменить значение для него. Можно действительно перебирать массив по ссылки как было уже сказано, но также можно непосредственно заносить изменения в изначальный массив как-то так:
// вариант 1 - изменяем изначальный массив
foreach ($orders as $key => $order) {
$orders[$key]['items'] = [];
}
// вариант 2 - используем перебор по ссылке
foreach ($orders as &$order) {
$order['items'] = [];
}
Во втором варианте не происходит копирование объекта, а используется ссылка на объект, который находится в массиве.