Muranx
@Muranx
кто понял this тот в цирке не смеётся

Где применяются key(), next(), current()?

Здравствуйте!

Интересуют методы next(), key(), current(), их применение. . . На сайте p**p.net сказано что метод key() возвращает значение ключа для текущего элемента массива, ок всё вроде ясно! НО...

1) получается у каждого созданного массива в php где- то под капотом есть индексатор текущих элементов? Если да, то где это можно проверить, потому-что возникает след. вопрос

2) допустим ситуацию, у меня есть пользовательский ассоциативный массив, и я по каким то причинам использую while(){} для пробега по его элементам, для выполнения каких-либо действий. . .

$user_ar = array(
     'name'=>'Alex', 
     'id'=>1234, 
     'state'=>'offline'
);

while(key($user_ar)){
	echo key($user_ar);
	echo '=>';
	echo current($user_ar);
	echo '<hr>';
	next($user_ar);
};

Но вот в чём суть, получается данным циклом я передвигаю с помощью метода next() тот самый "внутренний указатель массива" тем самым получается после окончания работы вайла указатель находится на последнем элементе массива, и соответственно при попытки воспроизвести данный цикл вайл снова я не получаю никакого вывода, что собственно "наверное" не удивительно, т.к. опять же на p**p.net написано что если указатель находится вне границ массива (собственно мы его и сдвинули с помощью next()) то получается key() возвратит NULL! По итогу главный вопрос : Зачем эти методы существуют, если в практике (ну по крайней мере на фронте, в том-же js) приходится ни один и даже не два раза обращаться к одному и тому-же объекту??, и если мы сдвигаем этот "указатель" с помощью некста() получается что это какие-то одноразовые методы , т.к. вторично на том-же пользовательском объекте (ну по крайней мере с моими знаниями) я его получается не смогу использовать, ну разве что если этот массив пересоздавать каждый раз, и итеррировать уже новый . . .
3) Ну и если ответы будут простыми и не многословными , то просьба ещё объяснить то, чего я не нашёл про эти три метода, или быть может упустил. . . Почему

$user_ar = array(
       'name'=>'Alex', 
       0=>10, 
       'me'=>20
);

while(key($user_ar)){
	echo key($user_ar);
	echo '=>';
	echo current($user_ar);
	echo '<hr>';
	next($user_ar);
};

.. не выводит индексированные элементы, а только именно названные (ну т.е. типа "name"=>"John"), причем я так понял (судя из примера выше) "натыкаясь" на индексированный элемент, внутренний указатель массива парализует, и он перестаёт итерировать дальше! В общем спасибо всем, кто откликнется!
  • Вопрос задан
  • 567 просмотров
Решения вопроса 2
DevMan
@DevMan Куратор тега PHP
1. это не методы, это функции.
2. они используются по своему прямому назначению.
3. что вы делаете в js не имеет никакого отношения к этим функциям.
Ответ написан
@Vitsliputsli
Если мы говорим про итерирование стандартных массивов php, то эти массивы - двусвязные списки, и их перебор наиболее эффективен при использовании указателя, а не обращения по ключу. Поэтому перебирать их следует с помощью итераторов (либо foreach, либо ООП итераторы, либо процедурные итерационные функции next(), prev(), reset() и т.д.). В js простые массивы устроены иначе, поэтому и работать с ними рекомендуется по-другому.
Для простого перебора слева направо всего массива достаточно foreach, но могут быть и более сложные варианты, тогда задействуются другие способы.
Насчет while(key($user_ar)), уже написали: while проверяет условие на true/false, если key($user_ar) = 0, то после динамического преобразования в bool, это будет false.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
У вас не полный список функций, есть ещё reset(), end(), each() и prev().
Двигаться по массиву таким образом можно в обе стороны, в отличие от foreach.
Ответ написан
rpsv
@rpsv
делай либо хорошо, либо никак
1. зачем?
2. потому что этим "методам" (функциям) не хватает еще одного: reset. С таким же успехом могли задать вопрос "а зачем нужны key и current, если нельзя сдвинуть указатель?"
3. потому что кто-то не знает языка, или хотя бы банально не видит что key возращает 0 на втором элементе и цикл заканчивается.

Дело раскрыто, это не баг языка, а неопытный "программист".
P.S. предлагаю следующий вопрос "а зачем while, если можно foreach?"
Ответ написан
t-alexashka
@t-alexashka
Сразу пишу legacy код
$user_ar = array(
		'name'=>'Alex', 
		0=>10, 
		'me'=>20
);

while(key($user_ar)){
	echo key($user_ar);
	echo '=>';
	echo current($user_ar);
	echo '<hr>';
	next($user_ar);
};


3. вы сами себе в ногу стреляете этим примером :) в проверке while(тут) у вас когда итерация добирается до 2го элемента с индексом 0,
этот 0 и прерывает цикл (т.к. 0 = false). Дело тут не в том, что индекс числительный, а именно в том что он равен нулю. Попробуйте поставить 1, и проблем быть не должно

ну а чтобы пройтись по массиву еще раз, нужно сбросить ему указатель через reset(). Либо используйте обычные foreach.
Ответ написан
@rPman
Где применяются key(), next(), current()?
а так же reset, end и другие, использут в случаях когда работу с элементами списка нужно вести либо вне главного цикла (т.е. он вывернут наружу и использовать классический foreach не удобно), или когда необходимо параллельно работать одновременно с несколькими циклами.

Причина банальна - в php не существует переменной - итератор, указателя на текущий элемент массива key-value массива (в терминологии javascript объектом). Это значение зашито и хранится в самом массиве.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы