Как найти индекс foreach

321

Можно ли найти индекс foreach?

в цикле for следующим образом:

for ($i = 0; $i < 10; ++$i) {
   echo $i . ' ';
}

$i даст вам индекс.

Нужно ли использовать цикл for или есть способ получить индекс в цикле foreach?

Теги:
loops
foreach

12 ответов

556
Лучший ответ
foreach($array as $key=>$value) {
    // do stuff
}

$key - это индекс каждого элемента $array

  • 1
    Зависит от того, что ОП означает под индексом: <? $ a = массив (3,5, 'xx', 4312, 'sasas'); снята с охраны ($ в [3]); foreach ($ a as $ k => $ v) print "\ $ k = $ k и \ $ v = $ v"; ?>
  • 8
    определенно, этот вопрос не очень специфичен, я понял, что ОП в значительной степени не знал о синтаксисе $ key => $ value
Показать ещё 5 комментариев
124

Вы можете поместить хак в свой foreach, например, поле, увеличивающееся при каждом прохождении, что точно соответствует циклу for в массиве с числовой индексацией. Таким полем будет псевдоиндекс, который требует ручного управления (приращения и т.д.).

A foreach даст вам ваш индекс в виде вашего значения $key, поэтому такой хак не нужен.

например, в foreach

$index = 0;
foreach($data as $key=>$val) {
    // Use $key as an index, or...

    // ... manage the index this way..
    echo "Index is $index\n";
    $index++;
}
  • 100
    Увеличение значения в цикле вряд ли является «взломом».
  • 13
    @ThomasMcCabe Можно даже сказать, что это одно из основных применений для цикла.
19

Следует отметить, что вы можете вызвать key() в любом массиве, чтобы найти текущий ключ. Как вы можете догадаться, current() вернет текущее значение, а next() переместит указатель массива на следующий элемент.

  • 0
    Это может быть полезно, если вы хотите использовать простой старый ассоциативный массив PHP для хранения данных, которые должны быть представлены через интерфейс Iterable (где вам нужно отслеживать, где вы находитесь в цикле).
  • 2
    +1 для альтернативы, но вызов функции в каждой итерации немного тяжелее, чем использование предварительно назначенных переменных (т. Е. Использование $key из $key=>$value ) ... Однако, держу пари, что более низкая производительность несущественна / ощутимо в простой петле.
13

У Оуэна есть хороший ответ. Если вам нужен только ключ, и вы работаете с массивом, это также может быть полезно.

foreach(array_keys($array) as $key) {
//  do stuff
}
  • 0
    И если вам нужен индекс, foreach(array_keys($array) as $index=>$key) .
10

Вы можете создать $i вне цикла и сделать $i++ в нижней части цикла.

  • 10
    Важно отметить, что этот подход дает текущую итерацию цикла, а НЕ текущий индекс итеративного массива.
6

Эти две петли эквивалентны (например, безопасные перила):

for ($i=0; $i<count($things); $i++) { ... }

foreach ($things as $i=>$thing) { ... }

например,

for ($i=0; $i<count($things); $i++) {
    echo "Thing ".$i." is ".$things[$i];
}

foreach ($things as $i=>$thing) {
    echo "Thing ".$i." is ".$thing;
}
  • 14
    Нет, если это ассоциативный массив
5

В массивах PHP есть внутренние указатели, поэтому попробуйте следующее:

foreach($array as $key => $value){
   $index = current($array);
}

Работает хорошо для меня (только очень предварительно протестировано).

3
Джонатан прав. Массивы PHP действуют как таблицы сопоставления карты со значениями. в некоторых случаях вы можете получить индекс, если ваш массив определен, например
$var = array(2,5);

for ($i = 0; $i < count($var); $i++) {
    echo $var[$i]."\n";
}

ваш вывод будет

2
5

и в этом случае каждый элемент массива имеет знающий индекс, но если вы затем сделаете что-то вроде следующего

$var = array_push($var,10);

for ($i = 0; $i < count($var); $i++) {
    echo $var[$i]."\n";
}

у вас нет выхода. Это происходит потому, что массивы в PHP не являются линейными структурами, как на большинстве языков. Они больше похожи на хеш-таблицы, которые могут иметь или не иметь ключей для всех сохраненных значений. Следовательно foreach не использует индексы для обхода над ними, потому что они имеют только индекс, если массив определен. Если вам нужно иметь индекс, убедитесь, что ваши массивы полностью определены до обхода над ними и используйте цикл for.

  • 0
    Да, именно поэтому в PHP мы должны «объединять массивы» по ключам, а не по индексам ... См. Также array_map (func, $ a, $ b).
  • 0
    Опс, дорогой читатель и @TheBrawnyMan, помните также, что ваш пример похож на ошибку array_push () (!). Рекомендуется использовать $var[] = 10; (см. руководство по PHP-ссылке), поэтому второй цикл for выводит ожидаемые результаты.
1

Я думаю, что лучший вариант такой же:

foreach ($lists as $key=>$value) {
    echo $key+1;
}

легко и обычно

1

Обычно я это делаю при работе с ассоциативными массивами:

foreach ($assoc_array as $key => $value) {
 //do something
}

Это будет отлично работать с неассоциативными массивами. $key будет значением индекса. Если вы предпочитаете, вы также можете сделать это:

foreach ($array as $indx => $value) {
  //do something
}
  • 4
    Для чего нужна «альтернатива»? Вы знаете, что это то же самое, кроме имен переменных? Так что последнее предложение и блок кода не нужны, я бы сказал - если это что-то делает, это просто смущает ..
  • 0
    @ Dennis98 Разница в том, что один из них имеет ассоциативный массив в качестве входа, а другой - числовой массив. Хотя, думаю, было бы лучше, если бы ответ был немного более подробным.
0
foreach(array_keys($array) as $key) {
//  do stuff
}
-3
foreach($arrvariable as $key=>$value){
echo "$key";
}
  • 2
    Было бы полезно объяснить, почему этот код работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню