Как найти индекс для каждого


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

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

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

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

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

Author: buræquete, 2008-09-26

12 answers

foreach($array as $key=>$value) {
    // do stuff
}

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

 693
Author: Owen, 2014-05-15 19:24:45

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

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++;
}
 134
Author: ConroyP, 2017-12-14 03:16:36

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

 22
Author: Bailey Parker, 2011-03-04 11:17:22

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

foreach(array_keys($array) as $key) {
//  do stuff
}
 14
Author: Zoredache, 2008-09-26 21:35:43

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

 11
Author: Ólafur Waage, 2015-08-19 11:20:40

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

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;
}
 7
Author: Trev, 2017-12-14 03:16:53

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

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

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

 5
Author: sth, 2010-12-29 04:35:32

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

 4
Author: The Brawny Man, 2008-09-26 18:47:18

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

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

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

 2
Author: Mikel Williams, 2017-12-14 03:17:21

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

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

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

foreach ($array as $indx => $value) {
  //do something
}
 1
Author: Randy Greencorn, 2017-12-14 03:17:07
foreach(array_keys($array) as $key) {
//  do stuff
}
 0
Author: gdmanandamohon, 2016-06-16 10:12:58
foreach($arrvariable as $key=>$value){
echo "$key";
}
 -4
Author: Senthil Kumar, 2016-09-20 13:22:42