PHP foreach по ссылке вызывает странный сбой при переходе через массив объектов
У меня есть массив объектов. Объекты в основном имеют кучу
потому что это объекты метаданных.
так что это
$objects[]
похож на кучу элементов, обладающих такими свойствами, как:
object->item1
, object->item2
и т.д.
Я хочу добавить что-то к каждому из этих объектов, поэтому...
foreach ($objects as &$object) {
$object->newItem=(something I compute);
}
то позже я хочу отобразить эти объекты в виде списка в html. Итак, я иду:
foreach ($objects as $object) {
<li><?php object output stuff here ?></li>
}
ок. Теперь он отлично работает, за исключением того, что последний объект отбрасывается, и
от второго до последнего объекта отображается дважды. WTF??
Это имеет смысл для вас?
Ответы
Ответ 1
Если вы повторяете по ссылке, всегда меняйте итерационную переменную:
foreach ($objects as &$object) {
// some code
}
unset($object);
Выдержка из foreach
документации:
Ссылка на значение $и последний элемент массива остаются даже после цикла foreach. Рекомендуется уничтожить его unset().
Если вы хотите понять, почему ваш код ведет себя так, как он себя ведет, читайте ниже: Ссылки и foreach
Ответ 2
Объекты всегда являются ссылками, поэтому просто удалите '&'
foreach ($objects as $object) {
$object->newItem=(something I compute);
}
foreach ($objects as $object) {
echo "<li>{$object->someResult()}</li>";
}
Я знаю, что вы уже получили свой ответ, но это может помочь другим разработчикам быстрее найти его.