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

можно найти ?

на for петли следующим образом:

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

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

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

12 ответов


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

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


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

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++;
}

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


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

foreach(array_keys($array) as $key) {
//  do stuff
}

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


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

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;
}

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

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

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


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


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

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

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


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

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

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

foreach ($array as $indx => $value) {
  //do something
}

foreach(array_keys($array) as $key) {
//  do stuff
}

foreach($arrvariable as $key=>$value){
echo "$key";
}