Покинул форум
Сообщений всего: 135
Дата рег-ции: Авг. 2010 Откуда: Кобеляки, Украина
Помог: 0 раз(а)
Спасиба всем
JustUserR
Отправлено: 19 Августа, 2010 - 20:56:36
Активный участник
Покинул форум
Сообщений всего: 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/
Мелкий
Отправлено: 19 Августа, 2010 - 21:16:56
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Покинул форум
Сообщений всего: 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/
Uchkuma
Отправлено: 19 Августа, 2010 - 21:35:58
Участник
Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010 Откуда: Киров
Помог: 6 раз(а)
Мелкий пишет:
У меня есть пруф: http://php.su/articles/?cat=common&page=006#cycle
Думаю, что данная статья уже устарела. Возможно это было актуально для более ранних версий php. Автор не указал дату публикации своей статьи, а также не указал версию php, на которой проводил тесты.
Кстати, на хабре можно найти "свежие" тесты на тему обхода циклов и там for чуть ли не медленнее foreach получается.
JustUserR
Отправлено: 19 Августа, 2010 - 22:00:26
Активный участник
Покинул форум
Сообщений всего: 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/
Мелкий
Отправлено: 19 Августа, 2010 - 22:54:02
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Звучит убедительно; ладно, будем считать, что пофиксили в актуальных версиях, так же, как и разницу по скорости include/require.
----- PostgreSQL DBA
JustUserR
Отправлено: 20 Августа, 2010 - 19:32:00
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Мелкий пишет:
Звучит убедительно; ладно, будем считать, что пофиксили в актуальных версиях, так же, как и разницу по скорости include/require.
Скорость и эффекивность работы определенных операций и встроенный функций - зависит не только от качестве составления вызываемой обрабатывающей процедуры в компилируемом виде но и от общего принциа ее работы - часто оказывается что эффективность некоторого метода достагается не за счет улучшения реализующего алгоритма а просто принципиально иного подхода
Такая же ситуация складывается с циклами и перебором элементов в списках - если бы в PHP существовали реальные целочисленные массивы то доступ к ним был бы конечно более быстрым использовации цикла for - однако в PHP представлены именно ассоциативные массивы для которых даже числовой индекс является ключом По этой причине обращение к некоторому элементу массива влечет за собой поиск указанного ключа во внутреннем списке - а при использовании цикла for генерируется много элементов для поиска на основе образующей строки
В то же время цикл foreach использует реальный внутренний индекс массива - который является именно числовым и обозначает все содержащиеся в нем элементы в некоторой последовательности - причем без пропусков в нумерации Именно такой способ доступа реализует наиболее прямое обращение к элемента - а следовательно и является самым быстрым
В качестве примера для проверки указанных выше сведений можно использовать операцию + для соединения массивов - даже если вы будете использовать исключительно числовые индексы то объединения все равно будет происходить по правилам для строковых ключей Кроме того если создать массив с явным использованием числовых индексов и оператора => - то все элементы в результате будут расположены только согласно порядоку их следования в генерирующем операторе - вне зависимости от использованых чисел
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.