Подтвердить что ты не робот

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??

Это имеет смысл для вас?

4b9b3361

Ответ 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>";
}

Я знаю, что вы уже получили свой ответ, но это может помочь другим разработчикам быстрее найти его.