Я создал класс php, который реализует интерфейс Iterator. Я успешно могу перебрать класс так:
foreach($data as $key=>$value)
echo $key;
Это, однако, последовательно дает мне странный результат:
foreach($data as $item)
echo key($item)
Первый стиль вызывает метод key () в моем классе для каждого элемента. Последний никогда не называет это.
Я что-то пропустил? Это должно работать, не так ли?
Обновление: я думаю, что что-то упустил. Функция key не работает так, как я ожидаю, для простого массива:
$test = [['name'=>'foo'],['name'=>'bar'],['name'=>'fizz']];
foreach($test as $key=>$item)
echo $key;
foreach ($test as $item)
echo key($item);
дает мне 012namenamename … не совсем то, что я ожидал. Я думаю, что мне нужно просто использовать нотацию $ key => value, и никогда не рассчитывать на key () в цикле.
Ваша первая версия верна, поэтому она работает. Для краткого объяснения, почему ваш второй метод не работает, см. этот комментарий в руководстве.
Это потому что (из руководства для foreach()
)
На каждой итерации значение текущего элемента присваивается значению $ value, а внутренний указатель массива увеличивается на единицу
Таким образом, ваш второй метод выбирает следующий ключ, а не текущий.
Других решений пока нет …