За последние 24 часа нас посетили 54147 программистов и 1720 роботов. Сейчас ищут 775 программистов ...

Интересное поведение foreach

Тема в разделе "Прочие вопросы по PHP", создана пользователем mkramer, 9 дек 2015.

  1. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Несколько раз попадался на одну и ту же проблему, причём на разных версиях php. Если поставить подряд два цикла foreach вот таким образом:
    Код (PHP):
    1. foreach ($users as &$u) {
    2.   /* some code */
    3. }
    4. foreach ($users as $u) {
    5. /* some code */
    6. }
    7.  
    то второй цикл будет работать неверно. Если или в первом или во втором цикле поменять $u на другое имя переменной, то всё будет ОК. Может кто-нибудь объяснить, с чем это связано?
     
  2. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    &$u вот с этим
     
  3. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    так он же говорит что второй цикл работает не правильно, интересно в чем не правильность и какой код выполняется за место some code, хотя бы примерно, в качестве примера.
     
  4. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    В доке об этом сказано.
    Надо делать так:
    Код (PHP):
    1. foreach ($users as &$u) {
    2.   /* some code */
    3. }
    4. $u = null;
    5. foreach ($users as $u) {
    6. /* some code */
    7. }
     
  5. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
  6. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    к сожалению в РНР невозможно создавать локальные переменные как допустим в С++, например:
    Код (PHP):
    1. int j = 100;
    2. {
    3.     int z = 200;
    4. }
    5. // за скобками z уже не существует, а j есть
    6. // в смысле в любом месте кода вот так вот можно вставить скобки и писать в них локальный код
    7. // и переменные за скобками уже не будут сещствовать  
    по этому после вызова цикла
    Код (PHP):
    1. foreach ($users as $u) {
    2. /* some code */
    3. }
    у тебя теперь существует переменная $u, за пределами цикла.

    а если ты пишешь &$u то это уже ссылки и дальше начинается беда.

    Добавлено спустя 44 секунды:
    Я просто думал что какая то другая проблема, более сложная, такая что я даже ее не могу понять, а тут такая мелочь :)
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Спасибо, узнал что-то новое.
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    При этом переменная все равно продолжает существовать, хоть и пустая.
    В документации предлагают делать unset($u). Чтоб наверняка.
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Единственное, где в php нужны ссылки - это в аргументах функций.