PHP: foreach — Manual

Change language: EnglishBrazilian PortugueseChinese (Simplified)FrenchGermanJapaneseRussianSpanishTurkishOther

Submit a Pull Request Report a Bug

(PHP 4, PHP 5, PHP 7, PHP 8)

Конструкция foreach предоставляет простой способ перебора массивов. foreach работает только с массивами и объектами, и будет генерировать ошибку при попытке использования с переменными других типов или неинициализированными переменными. Существует два вида синтаксиса:

Первый цикл перебирает массив, задаваемый с помощью iterable_expression. На каждой итерации значение текущего элемента присваивается переменной $value.

Второй цикл дополнительно присвоит ключ текущего элемента переменной $key на каждой итерации.

Обратите внимание, что foreach не изменяет указатель внутреннего массива, который используется такими функциями, как current() и key().

Возможно настроить итераторы объектов.

Для того, чтобы напрямую изменять элементы массива внутри цикла, переменной $value должен предшествовать знак &. В этом случае значение будет присвоено по ссылке.

Внимание

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

Можно перебирать значение постоянного массива по ссылке:

Замечание:

Оператор

foreach не поддерживает возможность подавления сообщений об ошибках с помощью префикса @.

Ещё несколько примеров, демонстрирующие использование оператора:

Распаковка вложенных массивов с помощью list()

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Можно перебрать массив массивов и распаковать вложенный массив в переменные цикла, передав list() в качестве значения.

Например:

Можно передавать меньшее количество элементов в list(), чем находится во вложенном массиве, в этом случае оставшиеся значения массива будут проигнорированы:

Если массив содержит недостаточно элементов для заполнения всех переменных из list(), то будет сгенерировано замечание об ошибке:

add a note

User Contributed Notes 3 notes

up

down

8

Okafor Chiagozie

5 months ago

An easier way to unpack nested array elements

$array = [
    [1, 2],
    [3, 4],
];

foreach ($array as [$a, $b]) {
    echo "A: $a; B: $b\n";
}

up

down

1

Sanusi Hassan

5 months ago

destructure array elements

you can unpac nested array elements using the following

<?php
$array = [
    [1, 2],
    [3, 4],
];

foreach ($array as $v) {
    [$a, $b] = $v;
    echo "A: $a; B: $b\n";
}
?>

up

down

-35

jon at pearkins dot com

4 months ago

For an array, foreach presents the elements of the array in the order that they were added to the array.

For example, if you need to have the elements presented in ascending order by key, use the ksort function to rearrange the elements of the array in key sequence.

This behavior is a result of the way that PHP arrays are stored. foreach merely presents the elements of an array in the order that they are stored within the array.

add a note

Kotlin. Циклы for, while, do-while, forEach, repeat()

Статья проплачена кошками — всемирно известными производителями котят.

Если статья вам понравилась, то можете поддержать проект.

  • for
  • Вложенные циклы for
  • forEach
  • repeat()
  • while
  • do-while

for

Цикл for в Kotlin имеет другой синтаксис. Применим в тех случаях, когда есть итератор — массив, Map и т.д. Стандартный вариант, когда нужно пробежаться по заданному числу элементов, описывается следующим образом. Если для цикла используется одна команда, можно обойтись без фигурных скобок, но проще всегда использовать блок.


for(i in 1..5)
    println(i)

for(i in 1..5){
    println(i)
}

Оператор in и его брат !in проверяют вхождение или отсутствие вхождения в диапазон.

В выражении 1..5 мы указываем диапазон от 1 до 5 (пять входит в диапазон). Переменная последовательно примет значение


1
2
3
4
5

Диапазон можно заменить переменной.


val range = 1..5
for(i in range){
    println("Элемент $i")
}

Вместо диапазона можно указать массив.


val cats = arrayListOf<String>()
cats.add("Мурзик")
cats.add("Васька")
cats.add("Барсик")
    
for(cat in cats){
    println("Кот $cat")
}

// Результат
Кот Мурзик
Кот Васька
Кот Барсик

Этот же пример можно переписать, используя индекс:


for (index in cats.indices){
    println("Кот ${cats[index]}")
}

Проверим, является ли символ не цифрой.


fun isNotDigit(c: Char) = c !in '0'..'9'

println(isNotDigit('3')) // false, это всё-таки цифра

С помощью index, element и withIndex() можно получить индекс и его значение в массиве.


val cats = arrayListOf("Barsik", "Murzik", "Vaska")
for( (index, element) in cats.withIndex()){
    println("$index: $element")
}

Получим.


0: Мурзик
1: Васька
2: Барсик

А как быть с вариантами, когда нужно счётчик не увеличивать на единицу, а уменьшать на 2? Используем ключевые слова

downTo и step.


for(i in 10 downTo 1 step 2){
    print("$i ")
}
// выводит: 10 8 6 4 2

Без указания шага значения будут уменьшаться на единицу.


for(i in 10 downTo 1){
    print("$i ")
}

// 10 9 8 7 6 5 4 3 2 1 

for (letter in 'Z' downTo 'A') print(letter)
// ZYXWVUTSRQPONMLKJIHGFEDCBA

Очень часто в циклах встречается выражение size-1, чтобы не выйти за пределы массива. Можно заменить на until.


for(i in 0..cats.size - 1){
    println(cats[i])
}
    
for(i in 0 until cats.size){
    println(cats[i])
}

Хотим выйти из цикла при достижении какого-то значения.


for (i in 1..5) {
    println(i)
	// прекращаем перебор, когда достигнем значения 3
    if (i == 3)
        break
}

// Получим
1
2
3

Ключевое слово continue позволяет продолжить перебор, при этом можно что-то сделать во время перебора, например, мяукнуть. Число 5 при этом не выводится.


println("For loop 1 to 10 continue if number is 5")
for (i in 1..10) {
    if (i == 5) {
        println("Meow")
        continue
    }
    println(i)
}

// Результат
For loop 1 to 10 continue if number is 5
1
2
3
4
Meow
6
7
8
9
10

Вложенные циклы for

Часто используют два цикла for. Простейший вариант.


// первый цикл
for(x in 1..3){
    // второй вложенный цикл
    for(y in 1..3){
        print("$x $y \n")
    }
}

// результат
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3

Если мы хотим досрочно прервать на каком-то этапе цикл, то можем добавить аннотацию

[email protected] к первому циклу и внутри второго цикла вызвать [email protected]. Как только значения станут равными (2 2), цикл завершится досрочно.


// первый цикл
[email protected] for (x in 1..3) {
    // второй вложенный цикл
    for (y in 1..3) {
        print("$x $y \n")
        if (x == 2 && y == 2)
            [email protected]
    }
}

// результат
1 1
1 2
1 3
2 1
2 2

forEach

Пройтись по всем элементам коллекции.


val daysOfWeek = listOf("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday")
daysOfWeek.
forEach{ println(it) }

repeat()

Встроенная функция для повторения команд заданное число раз.


repeat(3){
    println("Васька! Иди жрать!")
}

while

Цикл while работает стандартным способом — пока условие остаётся истинным, выполняются команды в блоке цикла. Если код после условия цикла состоит из одной строчки, то фигурные скобки можно опустить.


var i = 1
while (i 

Обратите внимание, что внутри цикла мы получим числа от 0 до 8, но если проверить, чему равно значение переменной после цикла, то увидим, что оно больше.

Прервать цикл можно через break.


var i = 1
while (i 

do-while

Выполняем какую-то работу, пока выполняется какое-то условие — выводим число, которое увеличивается на единицу, пока число меньше 10.


var i = 1
do {
    println(i)
    i++
} while (i 

Можно прервать цикл через break. Когда число станет равным 5, цикл прекратится.


var i = 1

do {
    println(i)
    if (i == 5)
        break
    i++
} while (i 

Дополнительные материалы

for для строки

Реклама

java — использовать varStatus цикла JSTL forEach в качестве идентификатора

спросил

Изменено 3 года, 10 месяцев назад

Просмотрено 258 тысяч раз

Я хочу использовать счетчик из цикла JSTL forEach, но мой код не работает.

 
    <дел>
    

производит

 
  • ява
  • jsp
  • jstl
  • эль

1

Переменная, заданная параметром varStatus , является объектом LoopTagStatus , а не целым числом. Использование:

 

Для уточнения:

  • ${theCount.index} начинает отсчет с 0 , если вы не установили атрибут begin
  • ${theCount.count} начинает отсчет с 1

1

можно использовать любой из следующих:

JSTL c:forEach varStatus properties

Описание метода получения свойств

  • current getCurrent() Элемент (из коллекции) для текущего раунд итерации.

  • index getIndex() Отсчитываемый от нуля индекс для текущего раунда итерация.

  • count getCount() Счетчик, основанный на единице, для текущего раунда итерации

  • first isFirst() Флаг, указывающий, является ли текущий раунд это первый проход через итерацию
  • last isLast() Флаг, указывающий, является ли текущий раунд последним проходом через итерацию

  • begin getBegin() Значение атрибута начала

  • end getEnd() Значение конечного атрибута

  • шаг getStep() Значение атрибута шага

Вы можете попробовать это. аналогичный результат

 
    <дел>
 
 

Это действительно помогло мне динамически генерировать идентификаторы showDetailItem для кода ниже.

 

 

если вы выполните эту строку напечатает следующее:

{индекс=3, количество=4, последнее=ложь, первое=ложь, конец=8, шаг=1, начало=0}

2

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

тег c:forEach | Мои знания и опыт работы с Java.

Тег JSTL forEach используется для перебора коллекции. Это может быть List, Set, ArrayList, HashMap или любая другая коллекция.

JSTL forEach Пример:

Чтобы отобразить название продукта в JSP, вы можете использовать тег , например:



<голова>

JSTL для каждого примера

<тело>
  
    
  


 

Вышеупомянутое утверждение предполагает, что объект productList доступен в этом JSP, и этот компонент продукта имеет имя свойства с сеттерами и геттерами.

Как вы можете видеть выше, в теге JSTL forEach атрибут items используется для определения коллекции. Он будет перебирать productList. На каждой итерации он будет получать переменную продукта, определенную атрибутом var. Атрибут состояния отслеживает итерацию.

Внутри начального и конечного тегов forEach вы можете отображать или применять другую логику к каждому объекту в коллекции. Как показано в приведенном выше примере, название продукта отображается с индексом с использованием тега c:out

Атрибуты тега JSTL forEach:

     1. items : Этот атрибут предоставляет набор элементов для повторения.

   2. var:  Этот атрибут предоставляет имя экспортируемой переменной области действия для текущего элемента итерации. Эта переменная области действия имеет вложенную видимость. Его тип зависит от объекта базовой коллекции.

     3. varStatus:  Этот атрибут предоставляет имя экспортируемой переменной области для статуса итерации. Экспортируемый объект имеет тип javax.servlet. jsp.jstl.core.LoopTagStatus. Эта переменная области имеет вложенную видимость.

     4. begin:  Если элементы указаны: Итерация начинается с элемента, расположенного по указанному индексу. Первый элемент коллекции имеет индекс 0. Если элементы не указаны: итерация начинается с индекса, установленного на указанное значение.

     5. end:  Если элементы указаны: Итерация заканчивается на элементе, расположенном по указанному индексу (включительно). Если элементы не указаны: итерация заканчивается, когда индекс достигает указанного значения.

6. шаг: Итерация будет обрабатывать только элементы каждого шага коллекции, начиная с первого.

Итерация по HashMap:

Возьмем другой пример, с которым многие сталкиваются при кодировании реального веб-приложения. Много раз вы получаете HashMap и должны перебирать его. В приведенном ниже примере я беру карту кода страны и валюты, где код страны уникален и выбран в качестве ключа, а валюта — это значение.

  :  
  

Цикл JSTL forEach – пример атрибута varStatus:

Цикл JSTL forEach предоставляет атрибут varStatus , который помогает отслеживать текущую итерацию. При работе с циклом важно иметь индекс текущей итерации.

Атрибут VarStatus тега JSTL forEach предоставляет возможность получить индекс текущей итерации. Разработчик может получить этот индекс, вызвав метод index для объекта varStatus. Возвращаемый индекс отсчитывается от нуля. Это означает, что первая итерация будет иметь индекс 0. Если будет 10 итераций, последняя итерация будет иметь индекс 9.. Это такой же индекс любой другой структуры данных в JAVA, как массив, ArrayList, LinkedList, HashSet и т. д.

JSTL forEach tag varStatus атрибут Пример:

Предположим, что приведенный ниже код перебирает список из 3 продуктов, который содержит следующие названия по порядку:

Красная ручка, Зеленая ручка, Розовая ручка