![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Drkwv |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 21.3.2006 Репутация: нет Всего: нет |
Получаю в ответ:
Вопрос - почему 122, а не 123? reset($ARGS) не помогает, а в print_r все нормально отображается. В чем причина такого поведения foreach? Добавлено через 6 минут и 21 секунду Тему можно снести |
||||
|
|||||
| Warpkid |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 26.4.2008 Репутация: 3 Всего: 3 |
==
Это сообщение отредактировал(а) Warpkid - 26.11.2010, 18:55 |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
От это поведение php станет логичнее? Причина в кривизне рук реализаторов foreach'а. Они не чистят предыдущее значение-сылку, а сразу начинают присваивать переменной значение из цикла. Непонятно, впрочем, почему не 121 получилось? Лечение семантическое - не нужно использовать одинаковые идентификаторы для циклов для переменных ссылок и переменных - значений. Более дорогое решение - завести дополнительную переменную и устанавливать после цикла на нее адрес переменной цикла. впрочем это все где-то на странице обсуждения foreach есть... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| skyboy |
|
||||||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
рекомендую читать ман, хотя бы в момент возникновения проблемы
естественно, твой код выдает именно такой результат. после первого цикла имя $val указывает туда же, куда и $ARGS[2]. потом, во втором цикле, в $val(соответственно, и в $ARGS[2]) записывается поочередно 1, затем 2. и когда подходит время перебора к третьему элементу, там как раз значение "2". впрочем, судя по ты уже и сам разобрался. разобрался бы ещё быстрее, запустив такой код:
и получив:
Добавлено @ 20:15 так работает reference. это не то же самое, что ссылки в С++. единственное "шаманство", которое могли бы добавить разработчики - принудительный unset переменной-контейнера, как они сами в мане и рекомендуют делать. но тогда за пределами цикла не было бы даже потенциальной возможности обработать $val. что было бы неприятно при преждевременном выходе по break. или даже без break - надо было бы при помощи дополнительных операций получать последний элемент. который в текущей реализации - на блюдечке преподносится. |
||||||
|
|||||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Ну дык сбрасывать можно было бы не в конце цикла, а в начале следующего. Причем лучше бы это делали именно сами zend'ы. Я не думаю, что кто-то теперешним малопредсказуемым свойством переменных-указателей пользуется. А вот использование адреса элемента цикла снаружи цикла - вещь иногда полезная. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |