Как найти индекс foreach - PullRequest
       52

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

416 голосов
/ 26 сентября 2008

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

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

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

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

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

Ответы [ 13 ]

778 голосов
/ 26 сентября 2008
foreach($array as $key=>$value) {
    // do stuff
}

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

150 голосов
/ 26 сентября 2008

Вы можете поместить хак в 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++;
}
24 голосов
/ 04 марта 2011

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

18 голосов
/ 27 сентября 2008

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

foreach(array_keys($array) as $key) {
//  do stuff
}
13 голосов
/ 26 сентября 2008

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

8 голосов
/ 28 января 2011

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

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;
}
5 голосов
/ 28 октября 2008

PHP-массивы имеют внутренние указатели, поэтому попробуйте это:

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

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

4 голосов
/ 26 сентября 2008

Джонатан прав. 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.

3 голосов
/ 12 мая 2016

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

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

легко и нормально

0 голосов
/ 08 апреля 2019

Я хотел бы добавить это, я использовал это в laravel, чтобы просто проиндексировать мою таблицу:

  • С $ loop-> index
  • Я также преинкрементую это с циклом ++ $, чтобы начать с 1

Мой код:

@foreach($resultsPerCountry->first()->studies as $result)
  <tr>
    <td>{{ ++$loop->index}}</td>                                    
  </tr>
@endforeach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...