- PHP Итерация массива
- Использование инкрементного индекса
- Использование указателей внутренних массивов
- Использование each
- Использование next
- Использование foreach
- Прямой контур
- Петля с ключами
- Петля по ссылке
- совпадение
- Использование ArrayObject Iterator
- Php foreach and next
- User Contributed Notes 20 notes
- How to get the next element in a foreach in PHP
- 4 answers
PHP
Итерация массива
Иногда необходимо объединить два массива одинаковой длины, например:
$people = ['Tim', 'Tony', 'Turanga']; $foods = ['chicken', 'beef', 'slurm'];
array_map — это самый простой способ сделать это:
array_map(function($person, $food) < return "$person likes $food\n"; >, $people, $foods);
Tim likes chicken Tony likes beef Turanga likes slurm
Это можно сделать с помощью общего индекса:
assert(count($people) === count($foods)); for ($i = 0; $i
Если у двух массивов нет инкрементных ключей, array_values($array)[$i] может использоваться для замены $array[$i] .
Если оба массива имеют одинаковый порядок ключей, вы также можете использовать цикл foreach-with-key на одном из массивов:
foreach ($people as $index => $person)
Отдельные массивы могут быть закодированы только в том случае, если они имеют одинаковую длину и имеют одинаковое имя ключа. Это означает, что если вы не предоставите ключ, и они пронумерованы, вы будете в порядке, или если вы назовете ключи и поместите их в одном порядке в каждом массиве.
Вы также можете использовать array_combine .
$combinedArray = array_combine($people, $foods); // $combinedArray = ['Tim' => 'chicken', 'Tony' => 'beef', 'Turanga' => 'slurm'];
Затем вы можете пройти через это, сделав то же самое, что и раньше:
foreach ($combinedArray as $person => $meal)
Использование инкрементного индекса
Этот метод работает, увеличивая число от 0 до наибольшего индекса в массиве.
$colors = ['red', 'yellow', 'blue', 'green']; for ($i = 0; $i < count($colors); $i++) < echo 'I am the color ' . $colors[$i] . '
'; >
Это также позволяет итерации массива в обратном порядке без использования array_reverse , что может привести к накладным расходам, если массив большой.
$colors = ['red', 'yellow', 'blue', 'green']; for ($i = count($colors) - 1; $i >= 0; $i--) < echo 'I am the color ' . $colors[$i] . '
'; >
Этот метод можно легко пропустить или перемотать индекс.
$array = ["alpha", "beta", "gamma", "delta", "epsilon"]; for ($i = 0; $i < count($array); $i++) < echo $array[$i], PHP_EOL; if ($array[$i] === "gamma") < $array[$i] = "zeta"; $i -= 2; >elseif ($array[$i] === "zeta") < $i++; >>
alpha beta gamma beta zeta epsilon
Для массивов, которые не имеют инкрементных индексов (включая массивы с индексами в обратном порядке, например [1 => «foo», 0 => «bar»] , [«foo» => «f», «bar» => «b»] ), это невозможно сделать напрямую. array_values array_keys можно использовать array_values или array_keys :
$array = ["a" => "alpha", "b" => "beta", "c" => "gamma", "d" => "delta"]; $keys = array_keys($array); for ($i = 0; $i
Использование указателей внутренних массивов
Каждый экземпляр массива содержит внутренний указатель. Управляя этим указателем, различные элементы массива могут быть извлечены из одного и того же вызова в разное время.
Использование each
Каждый вызов для each() возвращает ключ и значение текущего элемента массива и увеличивает указатель внутреннего массива.
$array = ["f" => "foo", "b" => "bar"]; while (list($key, $value) = each($array))
Использование next
$array = ["Alpha", "Beta", "Gamma", "Delta"]; while (($value = next($array)) !== false)
Обратите внимание, что в этом примере предполагается, что никакие элементы в массиве не идентичны логическому false . Чтобы предотвратить такое предположение, используйте key чтобы проверить, достиг ли внутренний указатель до конца массива:
$array = ["Alpha", "Beta", "Gamma", "Delta"]; while (key($array) !== null)
Это также облегчает итерацию массива без прямого цикла:
class ColorPicker < private $colors = ["#FF0064", "#0064FF", "#64FF00", "#FF6400", "#00FF64", "#6400FF"]; public function nextColor() : string < $result = next($colors); // if end of array reached if (key($colors) === null) < reset($colors); >return $result; > >
Использование foreach
Прямой контур
Петля с ключами
$foods = ['healthy' => 'Apples', 'bad' => 'Ice Cream']; foreach ($foods as $key => $food)
Петля по ссылке
В циклах foreach в приведенных выше примерах изменение значения ( $color или $food ) напрямую не изменяет его значение в массиве. Оператор & требуется, чтобы это значение указывало на элемент в массиве.
$years = [2001, 2002, 3, 4]; foreach ($years as &$year)
$years = [2001, 2002, 3, 4]; for($i = 0; $i < count($years); $i++) < // these two lines $year = &$years[$i]; // are changed to foreach by reference if($year
совпадение
Массивы PHP могут быть изменены любым способом во время итерации без проблем параллелизма (в отличие от, например, Java List s). Если массив повторяется по ссылке, на последующие итерации будут влиять изменения в массиве. В противном случае изменения в массиве не повлияют на последующие итерации (как если бы вы повторяли копию массива). Сравнение циклов по значению:
$array = [0 => 1, 2 => 3, 4 => 5, 6 => 7]; foreach ($array as $key => $value) < if ($key === 0) < $array[6] = 17; unset($array[4]); >echo "$key => $value\n"; >
Но если массив повторяется со ссылкой,
$array = [0 => 1, 2 => 3, 4 => 5, 6 => 7]; foreach ($array as $key => &$value) < if ($key === 0) < $array[6] = 17; unset($array[4]); >echo "$key => $value\n"; >
Набор значений ключа 4 => 5 больше не повторяется, а 6 => 7 изменяется на 6 => 17 .
Использование ArrayObject Iterator
Php-матрица позволяет вам изменять и отменять значения при повторении массивов и объектов.
$array = ['1' => 'apple', '2' => 'banana', '3' => 'cherry']; $arrayObject = new ArrayObject($array); $iterator = $arrayObject->getIterator(); for($iterator; $iterator->valid(); $iterator->next()) < echo $iterator->key() . ' => ' . $iterator->current() . ""; >
1 => apple 2 => banana 3 => cherry
- Начало работы с PHP
- APCu
- BC Math (бинарный калькулятор)
- Imagick
- IMAP
- JSON
- Loops
- PDO
- PHP MySQLi
- php mysqli affected rows возвращает 0, когда он должен возвращать положительное целое число
- PHP Встроенный сервер
- PHPDoc
- PSR
- SimpleXML
- SQLite3
- Streams
- URL-адрес
- UTF-8,
- WebSockets
- XML
- YAML в PHP
- Автозагрузка грунтовки
- Альтернативный синтаксис для структур управления
- Анализ HTML
- Асинхронное программирование
- Аутентификация HTTP
- Безопасность
- Буферизация вывода
- Вклад в PHP Core
- Внедрение зависимости
- Внесение изменений в Руководство по PHP
- Волшебные константы
- Волшебные методы
- Вывод значения переменной
- Выполнение по массиву
- Генераторы
- закрытие
- Защитите Remeber Me
- Интерфейс командной строки (CLI)
- Использование cURL в PHP
- Использование MongoDB
- Использование Redis с PHP
- Использование SQLSRV
- Итерация массива
- Как определить IP-адрес клиента
- Как разбить URL-адрес
- Класс Datetime
- Классы и объекты
- Клиент SOAP
- Комментарии
- Компилировать расширения PHP
- Компиляция ошибок и предупреждений
- Константы
- Контрольные структуры
- криптография
- кэш
- локализация
- Манипулирование массивом
- Манипуляции заголовков
- Массивы
- Машинное обучение
- Менеджер зависимостей композитора
- Многопоточное расширение
- многопроцессорная обработка
- Монго-PHP
- Область переменных
- Обработка изображений с помощью GD
- Обработка исключений и отчетов об ошибках
- Обработка нескольких массивов вместе
- Обработка файлов
- Общие ошибки
- операторы
- отладка
- Отправка электронной почты
- отражение
- переменные
- Переменные Superglobal PHP
- Печенье
- Поддержка Unicode в PHP
- Пространства имен
- Работа с датами и временем
- Развертывание докеров
- Регулярные выражения (regexp / PCRE)
- Рекомендации
- Рецепты
- Розетки
- Сервер SOAP
- Сериализация
- Сериализация объектов
- сессии
- Соглашения о кодировании
- Создание PDF-файлов в PHP
- Спектакль
- Строковый анализ
- Структуры данных SPL
- Тестирование устройства
- Тип жонглирования и нерегулярные проблемы сравнения
- Тип подсказки
- Типы
- Установка в средах Linux / Unix
- Установка среды PHP в Windows
- Фильтры и функции фильтра
- Форматирование строк
- функции
- Функции хеширования пароля
- Функциональное программирование
- Черты
- Чтение данных запроса
- Шаблоны проектирования
Php foreach and next
continue is used within looping structures to skip the rest of the current loop iteration and continue execution at the condition evaluation and then the beginning of the next iteration.
Note: In PHP the switch statement is considered a looping structure for the purposes of continue . continue behaves like break (when no arguments are passed) but will raise a warning as this is likely to be a mistake. If a switch is inside a loop, continue 2 will continue with the next iteration of the outer loop.
continue accepts an optional numeric argument which tells it how many levels of enclosing loops it should skip to the end of. The default value is 1 , thus skipping to the end of the current loop.
$i = 0 ;
while ( $i ++ < 5 ) echo "Outer
\n" ;
while ( 1 ) echo "Middle
\n" ;
while ( 1 ) echo "Inner
\n" ;
continue 3 ;
>
echo "This never gets output.
\n" ;
>
echo "Neither does this.
\n" ;
>
?>
Omitting the semicolon after continue can lead to confusion. Here's an example of what you shouldn't do.
One can expect the result to be:
Version | Description |
---|---|
7.3.0 | continue within a switch that is attempting to act like a break statement for the switch will trigger an E_WARNING . |
User Contributed Notes 20 notes
The remark "in PHP the switch statement is considered a looping structure for the purposes of continue" near the top of this page threw me off, so I experimented a little using the following code to figure out what the exact semantics of continue inside a switch is:
for( $i = 0 ; $i < 3 ; ++ $i )
echo ' [' , $i , '] ' ;
switch( $i )
case 0 : echo 'zero' ; break;
case 1 : echo 'one' ; XXXX ;
case 2 : echo 'two' ; break;
>
echo ' ' ;
>
- continue 1
- continue 2
- break 1
- break 2
and observed the different results. This made me come up with the following one-liner that describes the difference between break and continue:
continue resumes execution just before the closing curly bracket ( > ), and break resumes execution just after the closing curly bracket.
Corollary: since a switch is not (really) a looping structure, resuming execution just before a switch's closing curly bracket has the same effect as using a break statement. In the case of (for, while, do-while) loops, resuming execution just prior their closing curly brackets means that a new iteration is started --which is of course very unlike the behavior of a break statement.
In the one-liner above I ignored the existence of parameters to break/continue, but the one-liner is also valid when parameters are supplied.
How to get the next element in a foreach in PHP
How to Speed up Your WordPress Website
How do I get the next element in an array using foreach?
For example, I'm iterating in an array and I need to know if the next element in this array is the same as what I'm about to do some operation against it.
4 answers
The php has an internal library called SPL (Standard PHP Library)
It has several objects and interfaces that help solve common problems we encounter.
The ArrayIterator creates an object from an array with methods for functions such as current , next , rewind , etc.
While CachingIterator is an iterator with "one eye on the fish and another on the cat", having a forward position in relation to the iterator.
Within foreach your code would look like this:
'tenho', 'sou' => 'keys', 'um' => 'para', 'array' => 'comparar', 'assoc' => 'galera' ]; $iterator = new CachingIterator(new ArrayIterator($arr)); var_dump($iterator->current()); // null var_dump($iterator->getInnerIterator()->current()); // string(5) "tenho" foreach($iterator as $key => $value)< echo "Atual: $value - "; $proximoValue = $iterator->getInnerIterator()->current(); echo "Proximo: $proximoValue \n"; // Sua lógica aqui >