





foreach($array as $key=>$value) {
// do stuff
}
$key - это индекс каждого элемента $array.
определенно, этот вопрос не очень конкретный, я понял, что OP в значительной степени не знал о синтаксисе $ key => $ value
ну, на самом деле это правильно, но не должен быть принятым ответом, поскольку ключ тоже может быть строкой. скажем, вы делаете $myarr['foo'] = 'bar';, этот метод не работает
@Toskan Почему это не удалось? В ассоциативном массиве существующий индекс Только является строкой $ key. Таким образом, foreach($array as $key=>$value) поместит "foo" в $key именно так, как вы ожидаете. Ни один числовой индекс никогда не может быть сопоставлен с конкретным элементом в массиве. В лучшем случае вы могли бы сказать, что это n-й элемент, но если бы вы использовали for($i = 0; $i < count($array); $i++), вы могли бы столкнуться с той же проблемой с числовым массивом, если бы индекс был unset() или если числовой индекс был выбран вручную (например, $array = [2 => "myvariable", "myOtherVariable"]) .
@Bison вы правы в том смысле, что он не подводит. Но это не соответствует вопросу OP. Он ищет числовые значения, такие как n-й элемент.
Как говорит @Toskan, это не должен быть принятый ответ. Я думаю, что лучше просто создать переменную вне цикла и отсчитывать оттуда, увеличивая ее с помощью vatiable++; на каждой итерации. Традиционный способ, но всегда работал.
Сегодня, посетив этот сайт, я обнаружил, что при итерации по элементу XML значение $ key всегда показывает «запись», потому что объекту XML не присвоено числовое значение, и все части называются «записью». Рассмотрим: $xmlstr = "<feed><entry><title>Title 1</title></entry><entry><title>Title 2</title></entry><entry><title>Title 3</title></entry></feed>"; так поступает: $content = SimpleXMLElement($xmlstr);, а затем foreach($content->entry as $key=>$el) { $ key всегда будет показывать «запись» вместо любого уникального индекса, который может работать для идентификации отдельной записи. Единственным выходом было использование переменной-счетчика
Вы можете создать $i вне цикла и сделать $i++ внизу цикла.
Важно отметить, что этот подход дает текущую итерацию цикла, а НЕ текущий индекс повторяемого массива.
Вы можете внести в свой 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++;
}
Увеличение значения в цикле вряд ли является «взломом».
@ThomasMcCabe Можно даже сказать, что это одно из основных применений цикла.
Джонатан прав. Массивы 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.
Да, именно поэтому в PHP мы должны «объединять массивы» по ключи, а не по индексы ... См. Также array_map (func, $ a, $ b).
Опс, дорогой читатель и @TheBrawnyMan, помните также, что ваш пример похож на ошибку array_push () (!). Рекомендуется использовать $var[] = 10; (см. Ссылку PHP на руководство), поэтому второй цикл for выдает ожидаемые результаты.
У Оуэна есть хороший ответ. Если вам нужен только ключ и вы работаете с массивом, это также может быть полезно.
foreach(array_keys($array) as $key) {
// do stuff
}
И если вам нужен индекс, foreach(array_keys($array) as $index=>$key).
У массивов PHP есть внутренние указатели, поэтому попробуйте следующее:
foreach($array as $key => $value){
$index = current($array);
}
У меня работает нормально (правда, только очень предварительно протестировано).
Эти две петли эквивалентны (конечно, за исключением перил безопасности):
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;
}
Нет, если это ассоциативный массив
Следует отметить, что вы можете вызвать key() в любом массиве, чтобы найти текущий ключ, на котором он находится. Как вы можете догадаться, current() вернет текущее значение, а next() переместит указатель массива на следующий элемент.
Это должно быть полезно, если вы хотите использовать простой старый ассоциативный массив PHP для хранения данных, которые должны отображаться через интерфейс Iterable (где вам нужно отслеживать, где вы находитесь в цикле).
+1 в качестве альтернативы, но вызов функции на каждой итерации немного тяжелее, чем использование предварительно назначенных переменных (то есть с использованием $key от $key=>$value) ... Однако я уверен, что более низкая производительность не имеет значения / ощутима в простом цикле.
Обычно я делаю это при работе с ассоциативными массивами:
foreach ($assoc_array as $key => $value) {
//do something
}
Это будет хорошо работать и с неассоциативными массивами. $ key будет значением индекса. Если хотите, вы тоже можете сделать это:
foreach ($array as $indx => $value) {
//do something
}
Для чего нужна «альтернатива»? Вы знаете, что это то же самое, кроме имен переменных? Так что последнее предложение и блок кода не нужны, я бы сказал - если он что-то делает, это просто сбивает с толку ..
@ Dennis98 Разница в том, что один из них имеет на входе ассоциативный массив, а другой - числовой. Хотя, думаю, было бы лучше, если бы ответ был более подробным.
Думаю, лучший вариант такой же:
foreach ($lists as $key=>$value) {
echo $key+1;
}
это легко и нормально
Работает как шарм
foreach(array_keys($array) as $key) {
// do stuff
}
Я хотел бы добавить это, я использовал это в laravel, чтобы просто проиндексировать свою таблицу:
Мой код:
@foreach($resultsPerCountry->first()->studies as $result)
<tr>
<td>{{ ++$loop->index}}</td>
</tr>
@endforeach
Этот вопрос не задавался для laravel. Переменная $loop не может использоваться, потому что она запрашивается для общего PHP.
Я решил так, когда мне пришлось использовать индекс и значение foreach в одном контексте:
$array = array('a', 'b', 'c');
foreach ($array as $letter=>$index) {
echo $letter; //Here $letter content is the actual index
echo $array[$letter]; // echoes the array value
}//foreach
Зависит от того, что означает OP под индексом: <? $ a = массив (3,5, 'xx', 4312, 'sasas'); не задано ($ a [3]); foreach ($ a as $ k => $ v) print "\ $ k = $ k and \ $ v = $ v"; ?>