Как найти индекс для каждого
Можно ли найти индекс foreach
?
В цикле for
следующим образом:
for ($i = 0; $i < 10; ++$i) {
echo $i . ' ';
}
$i
даст вам индекс.
Должен ли я использовать цикл for
или есть какой-то способ получить индекс в цикле foreach
?
12 answers
foreach($array as $key=>$value) {
// do stuff
}
$key
является индексом каждого элемента $array
Вы можете добавить хак в свой 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++;
}
Следует отметить, что вы можете позвонить 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
}
Это также будет хорошо работать с неассоциативными массивами. $ключ будет значением индекса. Если вы предпочитаете, вы тоже можете сделать это:
foreach ($array as $indx => $value) {
//do something
}
foreach(array_keys($array) as $key) {
// do stuff
}
foreach($arrvariable as $key=>$value){
echo "$key";
}