PHP foreach по ссылке вызывает странные затруднения при просмотре массива объектов - PullRequest
18 голосов
/ 28 апреля 2011

У меня есть массив объектов. Объекты в основном имеют кучу свойства, потому что это объекты метаданных.

так это как $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 ??

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

Ответы [ 2 ]

36 голосов
/ 28 апреля 2011

Если вы выполняете итерацию по ссылке, всегда сбрасывайте переменную итерации после этого:

foreach ($objects as &$object) {
      // some code
}
unset($object);

Выдержка из foreach документации :

Ссылка на значение $ и последний элемент массива остаются даже после цикла foreach. Рекомендуется уничтожить его с помощью unset ().

Если вы хотите понять, почему ваш код ведет себя так, как он ведет себя, вот некоторые дополнительные чтения: Ссылки и foreach

4 голосов
/ 08 июля 2012

Объекты всегда являются ссылками, поэтому просто удалите '&'

foreach ($objects as $object) {
  $object->newItem=(something I compute);
}

foreach ($objects as $object) {
  echo "<li>{$object->someResult()}</li>";
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...