За последние 24 часа нас посетили 35886 программистов и 1745 роботов. Сейчас ищут 1353 программиста ...

вопрос по foreach и for

Тема в разделе "PHP для новичков", создана пользователем vikrorpert, 24 янв 2017.

  1. vikrorpert

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

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    php 7
    PHP:
    1. function t()
    2. {
    3.     var_dump(1);
    4.     return [1,2,3];
    5. }
    6.  
    7. foreach (t() as $item) {
    8.     echo $item;
    9. }
    10.  
    11. for ($i=0; $i<count(t());$i++) {
    12.     echo $i;
    13. }
    на выходе
    Код (Text):
    1. /home/k/www/test/2.php:5:int 1
    2. 123
    3. /home/k/www/test/2.php:5:int 1
    4. 0
    5. /home/k/www/test/2.php:5:int 1
    6. 1
    7. /home/k/www/test/2.php:5:int 1
    8. 2
    9. /home/k/www/test/2.php:5:int 1
    почему так?
     
  2. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Функция t():
    var_dump (1); 1, е тип данных, и расположение, видимо. Ну с foreach понятно, она перебирает массив [1,2,3], и выводит его. Далее: for от 0 до count(t()), где t() возвращает [1,2,3], то есть count(t()) == 3. Вот он и считает: 0, 1, 2 (3 значения, от нуля до трёх не включительно).
     
  3. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Если ты имеешь ввиду почему var_dump()в одном случае вызывается 1 раз а в другом 3,то в первом случае foreach получает массив и далее с ним работает, не вызывая каждый раз t(). Во втором случае сount() каждую итерацию вызывает t() для того,что бы посчитать количество элементов массива.
     
  4. vikrorpert

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

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    странно я думал что в обоих случаях t() будет вызываться на каждую итерацию
     
  5. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Нет. foreach один раз берет значение, копирует его, и работает с ним.

    А вторая конструкция у тебя эквивалентна:
    PHP:
    1. for ($i=0; $i<2;$i++) {
    2.     echo $i;
    3. }
    Тут нечему удивляться же. Оно же $i выводит, а не длину.
    И да, правильнее делать так:

    PHP:
    1. $array = t();
    2. for ($i=0, $limit = count($array); $i < $limit; $i++) {
    3.     echo $i;
    4. }
    Чтобы не дергать ничего лишние разы.