$animals = array('cat', 'dog', 'horse', 'elephant'); foreach($animals as $animal) { var_dump($animal); next($animals); }
Вышеуказанный код: кошка, собака, лошадь, слон. Я думал, что next
функция должна перемещать внутренний указатель на $animals
и, таким образом, я должен получать этот вывод вместо: кошка, лошадь.
Как заставить внутренний указатель $ животных двигаться вперед (и назад) таким образом, чтобы он был затронут в foreach?
ИЗМЕНИТЬ 1:
Из руководства:
Поскольку foreach полагается на указатель внутреннего массива, изменяющий его в цикле, может привести к неожиданному поведению.
Тем не менее, я думаю, что это то, что мне нужно делать.
EDIT 2:
По ссылке «Ваше здравое чувство» я предоставлю более подробное объяснение моей проблемы. Вот какой-то код psuedo:
array $foos; start loop of $foos - do thing #1 - do thing #2 - do thing #3 - keep doing thing #3 while the current value of $foos in the loop meets a certain criteria loop
Когда выполнение возвращается к началу цикла, оно должно продолжаться с последнего массива, к которому обращается № 3. Обратите внимание, что массив ассоциативен , поэтому метод for ($i = 0 ...
не работает.
Вы можете просто создать Документы ArrayIterator
которые являются ArrayIterator
seekable
Документами .
Поскольку это итератор, вы можете изменить положение, пока вы его перебираете, некоторый рудиментарный пример:
foreach ($iterator as $current) { $iterator->next(); }
Он должен предлагать все необходимое из коробки. Если нет, вы можете инкапсулировать свои потребности в Документы Iterator
самостоятельно.
Вы не должны смешивать foreach
с прямым доступом указателя. Если вы хотите перемещаться по массиву, просто замените foreach
на C-стиль. Он длиннее в верхней части, но работает с идентичным телом цикла в случае foreach
, с той разницей, что вы можете гадать с внутренним указателем и иметь желаемый результат.
$animals = array('cat', 'dog', 'horse', 'elephant'); for ($animal = current($animals), $index = key($animals); $animal; $animal = next($animals), $index = key($animals)) { print "$index:"; var_dump($animal); next($animals); }
Вывод:
0:string(3) "cat" 2:string(5) "horse"
Очень неправильно использовать конструкцию сквозной итерации, подобную foreach
когда вы действительно перемещаетесь назад и вперед внутри массива. Вышеприведенное for
цикла лучше в этом отношении, но не сильно; цикл while, со всеми деталями, явно указанными в теле цикла, может быть лучшим выбором.
Решение Mark довольно близко, но не удается, если массив содержит значения, такие как 0, false или «", которые вычисляют false во втором выражении цикла.
Это решение работает для всех массивов и немного ближе к «духу» цикла for. Сброс () в первом выражении цикла гарантирует, что мы начнем с начала массива, что было бы в случае с foreach. Второе выражение в цикле for должно оценить, указывает ли элемент указатель массива на существующий. key () возвращает null, если указатель массива указывает на конец массива или массив пуст. Третье выражение продвигает указатель массива в конце каждой итерации.
$animals = array('cat', 'dog', 'horse', 'elephant'); for (reset($animals); key($animals) !== null; next($animals)) { $animal = current($animals); var_dump($animal); next($animals); }
Эти результаты:
string(3) "cat" string(5) "horse"
Я думаю, потому что он просто хочет пропустить элементы, он может использовать «продолжить» в сочетании с if-предложением внутри foreach.
$skip=array ('dog', 'elephant'); $animals = array('cat', 'dog', 'horse', 'elephant'); foreach($animals as $animal) { if (in_array($animal, $skip)) { continue; } var_dump($animal); }
это выведет:
string(3) "cat" string(5) "horse"
Вариант 2 без продолжения с тем же эффектом:
$skip=array ('dog', 'elephant'); $animals = array('cat', 'dog', 'horse', 'elephant'); foreach($animals as $animal) { if (!in_array($animal, $skip)) { var_dump($animal); } }
Добавить &
к значению
foreach ($variable as $key => &$value) { }
Теперь ссылка $value
на $variable[$key]
address
Вам не нужно увеличивать указатель вручную в конце цикла foreach – это делается автоматически. Вам не нужно ничего больше, чем:
foreach($animals as $animal) { var_dump($animal) }