Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: что такое foreach

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Обясните что да как с етим чудом
LifePlay
Отправлено: 19 Августа, 2010 - 19:22:34
Post Id



Частый гость


Покинул форум
Сообщений всего: 135
Дата рег-ции: Авг. 2010  
Откуда: Кобеляки, Украина


Помог: 0 раз(а)




Вобщем хочу узнать как пользоватся foreach и что ето вобще такое Растерялся Растерялся
 
 Top
Мелкий Супермодератор
Отправлено: 19 Августа, 2010 - 19:32:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Один из циклов. Работает медленнее for'a из-за копирования данных, но удобен для перебора ассоциативных массивов.
http://php.su/learnphp/cs/?cycles#foreach


-----
PostgreSQL DBA
 
 Top
Uchkuma
Отправлено: 19 Августа, 2010 - 19:51:04
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




foreach
(Добавление)
Мелкий пишет:
Работает медленнее for'a из-за копирования данных
Довольно распространенное заблуждение.
 
 Top
LifePlay
Отправлено: 19 Августа, 2010 - 20:39:31
Post Id



Частый гость


Покинул форум
Сообщений всего: 135
Дата рег-ции: Авг. 2010  
Откуда: Кобеляки, Украина


Помог: 0 раз(а)




Спасиба всем
 
 Top
JustUserR
Отправлено: 19 Августа, 2010 - 20:56:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Мелкий пишет:
Но удобен для перебора ассоциативных массивов.
В языке PHP имеется достаточно мощная система автоматического преобразования типов данных - в резульате которого стороковые и числовые переменные и константы являются практически эквивалентными В силу этого на PHP все используемые массивы являются исключительно ассоциативными а числовых в чистом виде не существуют - это реализуется за счет того что индекс массива являющийся некоторым числом полностью эквиваленте строке которая содержит это же число по правилам автоматического преобразования Конечно для массивов которые содержат ключи исключительно в виде элементов являющихся взаимно-однозначными строками и числами типа 7 и "7" - возможно использовать обычный цикл for для последовательного доступа к элементам массива - однако в широком смысле такой похдод является не перебором а генерирующим образующие строки для ключа - как например явно строковое значение типа "myname".$i
В то же время ассоциативные массивы не совсем являются хеш-массивами - поскольку все элементы расположены в них в строго определенном порядке и имеют внутренний индексный номер - он не относится к реальному ключу массива и задается функциями типа next/reset В результате этого можно сказать что цикл foreach работает примерно таким образом - for(reset($arr);(list($key,$value)=each($arr))!==null; /* not action */ ) - и по этой причине его использование не только не снижает эффективость но и работа с реальным внутренними индесами может ее в принципе повышать


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Мелкий Супермодератор
Отправлено: 19 Августа, 2010 - 21:16:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Uchkuma пишет:
Довольно распространенное заблуждение.

Хорошо, докажите обратное.
У меня есть пруф: http://php.su/articles/?cat=comm...p;page=006#cycle


-----
PostgreSQL DBA
 
 Top
JustUserR
Отправлено: 19 Августа, 2010 - 21:20:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Мелкий пишет:
Хорошо, докажите обратное
В предудыщем сообщение достаточно полно описывается структура хранения ассоциатианых массивов в PHP и их обработка - вследстивие чего можно делать косвенный вывод о быстродействии цикла foreach
Цитата:
В то же время ассоциативные массивы не совсем являются хеш-массивами - поскольку все элементы расположены в них в строго определенном порядке и имеют внутренний индексный номер - он не относится к реальному ключу массива и задается функциями типа next/reset В результате этого можно сказать что цикл foreach работает примерно таким образом - for(reset($arr);(list($key,$value)=each($arr))!==null; /* not action */ ) - и по этой причине его использование не только не снижает эффективость но и работа с реальным внутренними индесами может ее в принципе повышать


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Uchkuma
Отправлено: 19 Августа, 2010 - 21:35:58
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




Мелкий пишет:
У меня есть пруф: http://php.su/articles/?cat=common&page=006#cycle
Думаю, что данная статья уже устарела. Возможно это было актуально для более ранних версий php. Автор не указал дату публикации своей статьи, а также не указал версию php, на которой проводил тесты.
Кстати, на хабре можно найти "свежие" тесты на тему обхода циклов и там for чуть ли не медленнее foreach получается. Улыбка
 
 Top
JustUserR
Отправлено: 19 Августа, 2010 - 22:00:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Uchkuma пишет:
Кстати, на хабре можно найти "свежие" тесты на тему обхода циклов и там for чуть ли не медленнее foreach получается
Использование цикла for дейтствительно может быть медленнее чем использование foreach по следующей причине - все элементы в ассоциативных массивах расположены в них в строго определенном порядке и имеют внутренний индексный номер - он не относится к реальному ключу массива и задается функциями типа next/reset В результате этого можно сказать что цикл foreach работает примерно таким образом - for(reset($arr);(list($key,$value)=each($arr))!==null; /* not action */ ) - и по этой причине его использование не только не снижает эффективость но и работа с реальным внутренними индесами может ее в принципе повышать
Таким образов получается что for с числовыми значениями работает как генерирующая идентификаторы функция - в то время как foreach осуществляет реальный внутри-индексный перебор


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Мелкий Супермодератор
Отправлено: 19 Августа, 2010 - 22:54:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Звучит убедительно; ладно, будем считать, что пофиксили в актуальных версиях, так же, как и разницу по скорости include/require.


-----
PostgreSQL DBA
 
 Top
JustUserR
Отправлено: 20 Августа, 2010 - 19:32:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Мелкий пишет:
Звучит убедительно; ладно, будем считать, что пофиксили в актуальных версиях, так же, как и разницу по скорости include/require.
Скорость и эффекивность работы определенных операций и встроенный функций - зависит не только от качестве составления вызываемой обрабатывающей процедуры в компилируемом виде но и от общего принциа ее работы - часто оказывается что эффективность некоторого метода достагается не за счет улучшения реализующего алгоритма а просто принципиально иного подхода
Такая же ситуация складывается с циклами и перебором элементов в списках - если бы в PHP существовали реальные целочисленные массивы то доступ к ним был бы конечно более быстрым использовации цикла for - однако в PHP представлены именно ассоциативные массивы для которых даже числовой индекс является ключом По этой причине обращение к некоторому элементу массива влечет за собой поиск указанного ключа во внутреннем списке - а при использовании цикла for генерируется много элементов для поиска на основе образующей строки
В то же время цикл foreach использует реальный внутренний индекс массива - который является именно числовым и обозначает все содержащиеся в нем элементы в некоторой последовательности - причем без пропусков в нумерации Именно такой способ доступа реализует наиболее прямое обращение к элемента - а следовательно и является самым быстрым
В качестве примера для проверки указанных выше сведений можно использовать операцию + для соединения массивов - даже если вы будете использовать исключительно числовые индексы то объединения все равно будет происходить по правилам для строковых ключей Кроме того если создать массив с явным использованием числовых индексов и оператора => - то все элементы в результате будут расположены только согласно порядоку их следования в генерирующем операторе - вне зависимости от использованых чисел


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB