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 :: Непонятный результат программы

 PHP.SU

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


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

> Без описания
koutinho
Отправлено: 21 Сентября, 2013 - 12:28:37
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Сент. 2013  


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




Здраствуйте, можт кому то покажется глупым и странным мой вопрос но все же:
Есть программа:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $arr=array(1,2,3,4);
  4. foreach ($arr as &$i)
  5. {
  6.     $i=$i*2;
  7. }
  8. for($i=0;$i<4;$i++)
  9. {
  10.     $arr[$i]+=1;
  11. }
  12. echo implode(', ',$arr);
  13. ?>
  14.  

По идее на первый взгляд она должна выводить 3 5 7 9 а на самом деле выводит 3, 5, 7, 5
Никак не могу понять почему выходные данные именно такие? Буду очень благодарен если кто нить обьяснит в чем тут фишка.
 
 Top
Саныч Модератор
Отправлено: 21 Сентября, 2013 - 12:35:38
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


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




koutinho, все дело в ссылке. У вас $i в строке 4 - это ссылка.
После foreach-а - это значение последнего элемента массива.
Затем в 8 строке вы его устанавливаете в 0, затем 4 итерации цикла и получается в итоге 5.

Если это в качестве учебного примера - то между циклами нужно добавить unset($i);

Если же нет - то это говнокод.

Что это?


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
koutinho
Отправлено: 21 Сентября, 2013 - 12:39:23
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Сент. 2013  


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




Саныч пишет:
koutinho, все дело в ссылке. У вас $i в строке 4 - это ссылка.
После foreach-а - это значение последнего элемента массива.
Затем в 8 строке вы его устанавливаете в 0, затем 4 итерации цикла и получается в итоге 5.

Ух да действительно, ну спасибо. Но все таки одно странно разве переменная i обьявленная в forech не является локальной и разве она не должна уничтожаться после выхода из цикла?
Это вопрос из теста по php, ну стало быть учебный пример.
Спасибо

(Отредактировано автором: 21 Сентября, 2013 - 12:40:49)

 
 Top
Саныч Модератор
Отправлено: 21 Сентября, 2013 - 12:45:29
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


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




koutinho пишет:
разве переменная i обьявленная в forech не является локальной и разве она не должна уничтожаться после выхода из цикла?
Своя область видимости, локальная, может быть только у функции/метода, но не у управляющих конструкций. У них нет своей области видимости, работают они с той, где объявлены. Если внутри метода/функции - то с локальной, если нет - с глобальной.
Уничтожаться само тоже ничего не должно.
Вобще возьмите за правило, если вы в цикле используете переменную-ссылку, то сразу за этим циклом уничтожать ее - unset($i).


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
koutinho
Отправлено: 21 Сентября, 2013 - 12:50:55
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Сент. 2013  


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




Саныч пишет:
koutinho пишет:
разве переменная i обьявленная в forech не является локальной и разве она не должна уничтожаться после выхода из цикла?
Своя область видимости, локальная, может быть только у функции/метода, но не у управляющих конструкций. У них нет своей области видимости, работают они с той, где объявлены. Если внутри метода/функции - то с локальной, если нет - с глобальной.
Уничтожаться само тоже ничего не должно.
Вобще возьмите за правило, если вы в цикле используете переменную-ссылку, то сразу за этим циклом уничтожать ее - unset($i).

Ага, понятно. Спасибо большое, Саныч. И еще один маленький вопрос, значит ли это что переменная инициализированная в цикле for в роли счетчика ну как правило i, тоже остается после выхода из цикла?
 
 Top
Саныч Модератор
Отправлено: 21 Сентября, 2013 - 12:54:00
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


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




koutinho пишет:
значит ли это что переменная инициализированная в цикле for в роли счетчика ну как правило i, тоже остается после выхода из цикла?
Конечно. Вот вам небольшой пример
PHP:
скопировать код в буфер обмена
  1. for ($i = 0; $i < 1234; $i++) {
  2.     // ...
  3. }
  4.  
  5. echo $i; // выведет 1234


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
koutinho
Отправлено: 21 Сентября, 2013 - 12:56:50
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Сент. 2013  


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




Саныч пишет:
koutinho пишет:
значит ли это что переменная инициализированная в цикле for в роли счетчика ну как правило i, тоже остается после выхода из цикла?
Конечно. Вот вам небольшой пример
PHP:
скопировать код в буфер обмена
  1. for ($i = 0; $i < 1234; $i++) {
  2.     // ...
  3. }
  4.  
  5. echo $i; // выведет 1234


Очень интересно, только что проверил как с этим обстоят дела в c#, оказывается там все переменные обьявленные в цикле уничтожаются после выхода из цикла, ну тоесть у цикла своя область видимости.
 
 Top
Саныч Модератор
Отправлено: 21 Сентября, 2013 - 13:00:23
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


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




Не знаю, я с C# вобще не знаком.
В PHP не уничтожается, в javascript тоже, в С помойму тоже...


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB