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

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
533
0
738 188
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Ответ принят как подходящий

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

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

Зависит от того, что означает OP под индексом: <? $ a = массив (3,5, 'xx', 4312, 'sasas'); не задано ($ a [3]); foreach ($ a as $ k => $ v) print "\ $ k = $ k and \ $ v = $ v"; ?>

Milen A. Radev 27.09.2008 04:21

определенно, этот вопрос не очень конкретный, я понял, что OP в значительной степени не знал о синтаксисе $ key => $ value

Owen 27.09.2008 04:23

ну, на самом деле это правильно, но не должен быть принятым ответом, поскольку ключ тоже может быть строкой. скажем, вы делаете $myarr['foo'] = 'bar';, этот метод не работает

Toskan 26.09.2014 10:40

@Toskan Почему это не удалось? В ассоциативном массиве существующий индекс Только является строкой $ key. Таким образом, foreach($array as $key=>$value) поместит "foo" в $key именно так, как вы ожидаете. Ни один числовой индекс никогда не может быть сопоставлен с конкретным элементом в массиве. В лучшем случае вы могли бы сказать, что это n-й элемент, но если бы вы использовали for($i = 0; $i < count($array); $i++), вы могли бы столкнуться с той же проблемой с числовым массивом, если бы индекс был unset() или если числовой индекс был выбран вручную (например, $array = [2 => "myvariable", "myOtherVariable"]) .

Byson 04.12.2014 13:51

@Bison вы правы в том смысле, что он не подводит. Но это не соответствует вопросу OP. Он ищет числовые значения, такие как n-й элемент.

Toskan 08.12.2014 07:12

Как говорит @Toskan, это не должен быть принятый ответ. Я думаю, что лучше просто создать переменную вне цикла и отсчитывать оттуда, увеличивая ее с помощью vatiable++; на каждой итерации. Традиционный способ, но всегда работал.

Jomar Sevillejo 30.10.2015 04:22

Сегодня, посетив этот сайт, я обнаружил, что при итерации по элементу 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 всегда будет показывать «запись» вместо любого уникального индекса, который может работать для идентификации отдельной записи. Единственным выходом было использование переменной-счетчика

LordNeo 06.04.2018 14:59

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

Важно отметить, что этот подход дает текущую итерацию цикла, а НЕ текущий индекс повторяемого массива.

Peter Bailey 26.09.2008 23:20

Вы можете внести в свой 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++;
}

Увеличение значения в цикле вряд ли является «взломом».

theflowersoftime 25.10.2013 22:59

@ThomasMcCabe Можно даже сказать, что это одно из основных применений цикла.

Byson 18.12.2014 12:58

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

Peter Krauss 21.05.2013 15:51

Опс, дорогой читатель и @TheBrawnyMan, помните также, что ваш пример похож на ошибку array_push () (!). Рекомендуется использовать $var[] = 10; (см. Ссылку PHP на руководство), поэтому второй цикл for выдает ожидаемые результаты.

Peter Krauss 21.05.2013 16:29

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

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

И если вам нужен индекс, foreach(array_keys($array) as $index=>$key).

Leo 16.06.2016 02:43

У массивов 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;
}

Нет, если это ассоциативный массив

JoeCortopassi 03.08.2011 19:48

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

Это должно быть полезно, если вы хотите использовать простой старый ассоциативный массив PHP для хранения данных, которые должны отображаться через интерфейс Iterable (где вам нужно отслеживать, где вы находитесь в цикле).

Peter 16.12.2011 01:33

+1 в качестве альтернативы, но вызов функции на каждой итерации немного тяжелее, чем использование предварительно назначенных переменных (то есть с использованием $key от $key=>$value) ... Однако я уверен, что более низкая производительность не имеет значения / ощутима в простом цикле.

Armfoot 02.09.2015 18:11

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

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

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

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

Для чего нужна «альтернатива»? Вы знаете, что это то же самое, кроме имен переменных? Так что последнее предложение и блок кода не нужны, я бы сказал - если он что-то делает, это просто сбивает с толку ..

Dennis98 28.10.2016 21:50

@ Dennis98 Разница в том, что один из них имеет на входе ассоциативный массив, а другой - числовой. Хотя, думаю, было бы лучше, если бы ответ был более подробным.

I_ATE_YOUR_WORK_FILES 19.07.2018 16:25

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

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

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

Работает как шарм

Steve Nosse 05.08.2019 23:06

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

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

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

Мой код:

@foreach($resultsPerCountry->first()->studies as $result)
  <tr>
    <td>{{ ++$loop->index}}</td>                                    
  </tr>
@endforeach

Этот вопрос не задавался для laravel. Переменная $loop не может использоваться, потому что она запрашивается для общего PHP.

Özgür Can Karagöz 06.11.2019 02:34

Я решил так, когда мне пришлось использовать индекс и значение 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

Другие вопросы по теме