Intereting Posts
php variable = variable1 || variable2 Почему динамические конструкции сложны для компиляторов php (HPHP)? Вызов PHP-скриптов из Javascript без оставления текущей страницы nginx 502 плохой шлюз json_decode возвращает NULL в строке, прошедшей через шифрование jqplot этикетка с надписью / легенда цвета и линии Лучший способ шифрования информации о клиентах в базе данных MySQL моей компании? Сценарий дампа базы данных PHP – есть ли какие-либо проблемы? Как правильно настроить переменную среды PHP для запуска команд в Git Bash Наиболее распространенный / любимый синтаксис для документации внутри кода (комментарии)? Лучший способ генерации уникальных имен файлов при загрузке файлов PHP Схема оформления WooCommerce Календарь PHP для бронирования номера с проверкой Mysql Что делает этот PHP? Это кодировщик / декодер? Неустранимая ошибка: обратный вызов массива должен содержать индексы 0 и 1

PHP: как перемещать указатель массива внутри цикла foreach?

$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) }