Как получить индекс массива в foreach

#php

#php

Вопрос:

У меня есть цикл foreach в php для итерации ассоциативного массива. В цикле вместо увеличения переменной я хочу получить числовой индекс текущего элемента. Возможно ли это.

 $arr = array('name'=>'My name','creditcard'=>'234343435355','ssn'=>1450);
foreach($arr as $person){
  // want index here
}
 

Обычно я делаю это, чтобы получить индекс:

 $arr = array('name'=>'My name','creditcard'=>'234343435355','ssn'=>1450);
    $counter =0;
    foreach($arr as $person){
      // do a stuff
$counter  ;
    }
 

Комментарии:

1. Для чего нужен числовой индекс для ассоциативного массива?

Ответ №1:

Используйте этот синтаксис foreach для доступа к ключу (как $index ) и значению (как $person )

 foreach ($arr as $index => $person) {
   echo "$index = $person";
}
 

Это объясняется в документации PHP foreach .

Ответ №2:

Зачем вам числовой индекс внутри ассоциативного массива? Ассоциативный массив сопоставляет произвольные значения с произвольными значениями, как в вашем примере, строки со строками и числами:

 $assoc = [
    'name'=>'My name',
    'creditcard'=>'234343435355',
    'ssn'=>1450
];
 

Числовые массивы отображают последовательные числа в произвольные значения. В вашем примере, если мы удалим все строковые ключи, нумерация будет такой:

 $numb = [
    0=>'My name',
    1=>'234343435355',
    2=>1450
];
 

В PHP вам не нужно указывать ключи в этом случае, он генерирует их сам.
Теперь, чтобы получить ключи в foreach инструкции, вы используете следующую форму, как уже показал вам @MichaelBerkowski:

 foreach ($arr as $index => $value) 
 

Если вы выполните итерацию по нумерованному массиву, $index у него будут числовые значения. Если вы выполните итерацию по массиву assoc, он будет иметь значения указанных вами ключей.

Серьезно, почему я вообще все это описываю ?! Это общеизвестно прямо из руководства!

Теперь, если у вас есть ассоциативный массив с некоторыми произвольными ключами, и вы должны знать нумерованную позицию значений, и вас не волнуют ключи, вы можете выполнить итерацию по результату array_values в вашем массиве:

 foreach (array_values($assoc) as $value) // etc
 

Но если вы заботитесь о ключах, вам нужно использовать дополнительный счетчик, как вы показали сами:

 $counter = 0;
foreach ($assoc as $key => $value)
{
    // do stuff with $key and $value
      $counter;
}
 

Или какой-то прикрученный материал в функциональном стиле array_reduce , не имеет значения.

Комментарии:

1. lol спасибо @hijarian. Это, как спрашивали 5 лет назад. Теперь я написал книги по PHP

2. @MarthaJames бвахаха, некропостинг! 🙂