Як знайти індекс foreach?


489

Чи можливо знайти foreachіндекс?

в forциклі наступним чином:

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

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

Чи потрібно використовувати forцикл чи є якийсь спосіб отримати індекс у foreachциклі?

Відповіді:


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

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


2
Залежить від того, що означає ОП за індексом: <? $ a = масив (3,5, 'xx', 4312, 'sasas'); unset ($ a [3]); foreach ($ a as $ k => $ v) print "\ $ k = $ k і \ $ v = $ v"; ?>
Мілен А. Радев,

9
безумовно, це питання не дуже конкретне, я вважав, що ОП значною мірою не знає синтаксису $ key => $ value
Оуена

38
ну це насправді правильно, але це не повинно бути прийнятою відповіддю, оскільки ключ може бути і рядком. сказати, що зробити $myarr['foo'] = 'bar';цей метод не вдається
Тоскан

12
@Bison Ви маєте рацію в тому сенсі, що це не провалюється. Але він не відповідає питанню ОП. Він шукає числові значення типу n-го елемента.
Тоскан

3
Як каже @Toskan, це не має бути прийнятою відповіддю. Я думаю, що краще просто створити змінну поза циклом і рахувати звідти, збільшуючи її з vatiable++;кожною ітерацією. Традиційний спосіб, але завжди працював.
Джомар Севільйо

172

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

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

127
Збільшення значення в циклі навряд чи є "хаком".
Томас МакКейб

17
@ThomasMcCabe Можна навіть сказати, що це одне з основних напрямків використання циклу.
Byson

26

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


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

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

20

Оуен має хорошу відповідь. Якщо ви хочете просто ключ, а ви працюєте з масивом, це також може бути корисним.

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

4
І якщо вам потрібен індекс, foreach(array_keys($array) as $index=>$key).
Лев

14

Ви можете створювати $iзовнішнє цикл і робити $i++внизу циклу.


16
Важливо зазначити, що такий підхід дає поточну ітерацію циклу, а не поточний індекс ітераційного масиву.
Пітер Бейлі

8

Ці дві петлі рівноцінні (смуга запобіжних поручнів звичайно):

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

17
Не якщо це асоціативний масив
JoeCortopassi


5

Джонатан прав. Масиви 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 не використовує індекси для повзання по них, тому що вони мають індекс лише у випадку, якщо масив визначений. Якщо вам потрібно мати індекс, переконайтеся, що ваші масиви повністю визначені, перш ніж переходити через них, і використовуйте для циклу.


Так, саме тому в PHP ми повинні "приєднуватися до масивів" за ключами, а не за індексами ... Дивіться також array_map (func, $ a, $ b).
Пітер Краус

Ой, шановний читачу та @TheBrawnyMan, пам’ятайте також, що ваш приклад - це помилка array_push () (!). Рекомендація полягає у використанні $var[] = 10;(див. Посилання PHP для керівництва), тому другий forцикл видає очікувані результати.
Пітер Краус

4

Масиви PHP мають внутрішні покажчики, тому спробуйте це:

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

Для мене працює добре (хоча дуже попередньо перевірено).


1

Я зазвичай роблю це під час роботи з асоціативними масивами:

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

Це буде добре працювати і з неасоціативними масивами. $ key буде значенням індексу. Якщо ви віддаєте перевагу, ви можете зробити це також:

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

4
Для чого "альтернатива"? Ви знаєте, що це те саме, крім імен змінних? Тож останнє речення та блок коду зайві, я б сказав - якщо він щось робить, то просто плутає ..
Dennis98

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

0

Я хотів би додати це, я використовував це в laravel, щоб просто індексувати свою таблицю:

  • З $ loop-> індексом
  • Я також попередньо підсилюю його циклом ++ $, щоб почати з 1

Мій код:

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

Це питання не було задано laravel. $loopЗмінна не може бути використана , так як просили загального PHP.
Özgür Can Karagöz

0

Я вирішив такий спосіб, коли мені довелося використовувати індекс і значення 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.