php 7 PHP: function t() { var_dump(1); return [1,2,3]; } foreach (t() as $item) { echo $item; } for ($i=0; $i<count(t());$i++) { echo $i; } на выходе Код (Text): /home/k/www/test/2.php:5:int 1 123 /home/k/www/test/2.php:5:int 1 0 /home/k/www/test/2.php:5:int 1 1 /home/k/www/test/2.php:5:int 1 2 /home/k/www/test/2.php:5:int 1 почему так?
Функция t(): var_dump (1); 1, е тип данных, и расположение, видимо. Ну с foreach понятно, она перебирает массив [1,2,3], и выводит его. Далее: for от 0 до count(t()), где t() возвращает [1,2,3], то есть count(t()) == 3. Вот он и считает: 0, 1, 2 (3 значения, от нуля до трёх не включительно).
Если ты имеешь ввиду почему var_dump()в одном случае вызывается 1 раз а в другом 3,то в первом случае foreach получает массив и далее с ним работает, не вызывая каждый раз t(). Во втором случае сount() каждую итерацию вызывает t() для того,что бы посчитать количество элементов массива.
Нет. foreach один раз берет значение, копирует его, и работает с ним. А вторая конструкция у тебя эквивалентна: PHP: for ($i=0; $i<2;$i++) { echo $i; } Тут нечему удивляться же. Оно же $i выводит, а не длину. И да, правильнее делать так: PHP: $array = t(); for ($i=0, $limit = count($array); $i < $limit; $i++) { echo $i; } Чтобы не дергать ничего лишние разы.