- Изучаем PHP цикл for, теория и практика
- range
- Return Values
- Examples
- Notes
- See Also
- User Contributed Notes 29 notes
- Цикл for: работаем с числами
- Пример можно? Да пожалуйста!
- Есть ещё что-то, что нужно знать?
- Где это применимо?
- Найти все чётные числа от 1 до 50 и вывести их
- Создать массив из 50 случайных значений
- Посчитать сумму чисел от 1 до 1000
Изучаем PHP цикл for, теория и практика
В PHP существуют различные виды циклов, но все они, по сути, делают одно и тоже. Просто с помощью одних циклов более просто решаются одни задачи, с помощью других – иные:
for(инициализация; условие выхода; оператор счетчика) < //тело цикла >
Основные части конструкции цикла for:
- инициализация — это выражение, которое выполняется один раз перед выполнением цикла; обычно используется для инициализации счётчика;
- условие выхода — это выражение, истинность которого проверяется перед каждой итерацией; если выражение вычисляется как истина, то выполняется итерация; в противном случае цикл for завершает работу;
- операто счетчика — это выражение, которое выполняется в конце каждой итерации; обычно используется для изменения счетчика;
- тело цикла — инструкции, выполнение которых нужно повторять.
Цикл for начинается объявлением переменной i (название счетчика не обязательное) и задания ей значения 0 . Затем проверяет, что i меньше девяти, выполняет выражения внутри цикла и увеличивает i на 1 каждый раз.
$str = ''; for ($i = 1; $i $str = rtrim($str, ',') . '.'; echo $str;//на выходе: 1,2,3,4,5,6,7,8,9,10.
- инициализация: $i = 1 (объявление переменной $i и присвоение ей значения 1);
- условие выполнения цикла: $i (пока значение переменной $i меньше или равно 10);
- финальное выражение, которое нужно выполнять в конце каждой итерации: $i++ (увеличение значение переменной $i на 1);
- в теле цикла в переменную $str записывается значения счетчика.
Альтернативный синтаксис цикла for
for ($i = 4; $i > 0; $i--): ?> $i = echo $i; ?>
endfor; ?> //на выходе: $i = 4
$i = 3
$i = 2
$i = 1
Операторы break и continue
Иногда возникает необходимость выйти из цикла до его завершения. В этом случае можно воспользоваться оператором break .
$x = 5; for ($i = 0; $i < 10; ++$i) < if ($i === $x) < echo $i;//на выходе: 5 break; > >
Когда значение переменной $i достигнет 5 , осуществляется выход из цикла с помощью оператора break .
В отличие от оператора break , оператор continue производит переход к следующей итерации. Например, нам надо посчитать сумму только нечетных чисел из некоторого диапазона:
$sum = 0; $n = 10; for ($i = 1; $i continue; > $sum += $i; > echo $sum;//на выходе: 25
Чтобы узнать, четное ли число, мы получаем остаток от целочисленного деления на 2 , и если он равен 0 , то с помощью оператора continue переходим к следующей итерации цикла. А если число нечетное, то складываем его с остальными нечетными числами.
Как и другие виды циклов, циклы for могут быть вложены внутрь других циклов. В следующем примере мы вкладываем цикл for внутрь другого цикла for :
$n = 9; for ($i = 1; $i echo $i * $j . ' '; > echo PHP_EOL; > //на выходе: 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
С помощью цикла for выведите на экран числа от 1 до 100.
$n = 100; for ($i = 1; $i echo $i . ' '; > //на выходе: 1 3 5 7 . 97 98 99 100
С помощью цикла for выведите на экран числа от 100 до 1.
$n = 100; for ($i = $n; $i > 0; $i--) < echo $i . ' '; > //на выходе: 100 99 98 97 . 4 3 2 1
Напишите цикл for, который печатает каждое четное число от 0 до 20. (Четное число — целое число, которое делится на 2 без остатка: −4, −2, 0, 2, 4, 6, 8,)
$n = 20; for ($i = 0; $i echo $i . ' '; > //на выходе: 0 2 4 6 8 10 12 14 16 18 20
Напишите цикл for, который печатает каждое нечетное число от 0 до 20. (Нечетное число — целое число, которое не делится на 2 без остатка: −3, −1, 1, 3, 5, 7, 9)
$n = 20; for ($i = 1; $i echo $i . ' '; > //на выходе: 1 3 5 7 9 11 13 15 17 19
Дополнительные упражнения с циклом for
Перед тем как набрать этот код, попытайтесь понять, что он делает.
$n = 3; for ($i = 1; $i < $n; $i = $i + 1) < for ($j = 1; $j < $n; $j = $j + 1) < for ($k = 1; $k < $n; $k = $k + 1) < echo "I: , J: , K: " . PHP_EOL; > > >
I: 1, J: 1, K: 1 I: 1, J: 1, K: 2 I: 1, J: 2, K: 1 I: 1, J: 2, K: 2 I: 2, J: 1, K: 1 I: 2, J: 1, K: 2 I: 2, J: 2, K: 1 I: 2, J: 2, K: 2
range
If a step value is given, it will be used as the increment (or decrement) between elements in the sequence. step must not equal 0 and must not exceed the specified range. If not specified, step will default to 1.
Return Values
Returns an array of elements from start to end , inclusive.
Examples
Example #1 range() examples
// array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
foreach ( range ( 0 , 12 ) as $number ) echo $number ;
>
?php
// The step parameter
// array(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
foreach ( range ( 0 , 100 , 10 ) as $number ) echo $number ;
>
// Usage of character sequences
// array(‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’);
foreach ( range ( ‘a’ , ‘i’ ) as $letter ) echo $letter ;
>
// array(‘c’, ‘b’, ‘a’);
foreach ( range ( ‘c’ , ‘a’ ) as $letter ) echo $letter ;
>
?>
Notes
Note:
Character sequence values are limited to a length of one. If a length greater than one is entered, only the first character is used.
See Also
User Contributed Notes 29 notes
To create a range array like
combine two range arrays using array_combine:
So with the introduction of single-character ranges to the range() function, the internal function tries to be «smart», and (I am inferring from behavior here) apparently checks the type of the incoming values. If one is numeric, including numeric string, then the other is treated as numeric; if it is a non-numeric string, it is treated as zero.
If you pass in a numeric string in such a way that is is forced to be recognized as type string and not type numeric, range() will function quite differently.
echo implode ( «» , range ( 9 , «Q» ));
// prints 9876543210
echo implode ( «» , range ( «9 » , «Q» )); //space after the 9
// prints 9:;?@ABCDEFGHIJKLMNOPQ
echo implode ( «» , range ( «q» , «9 » ));
// prints qponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@ ?> =?>
I wouldn’t call this a bug, because IMO it is even more useful than the stock usage of the function.
The function «range» is very useful to get an array of characters as range(‘C’,’R’) does.
At work, I had to extend the function range($a,$b) to work in this special case: with two uppercase strings $a and $b, it should return all the possible strings between $a and $b.
This could be used for example to get the excel column indexes.
e.g. array( ‘A’ , ‘B’ , ‘C’ . ‘Z’ , ‘AA’ , ‘AB’ , ‘AC’ , ‘AD’ ) ?>
So I wrote the function getrange($min,$max) that exactly does this.
function getcolumnrange ( $min , $max ) $pointer = strtoupper ( $min );
$output =array();
while( positionalcomparison ( $pointer , strtoupper ( $max )) <= 0 )array_push ( $output , $pointer );
$pointer ++;
>
return $output ;
>
function positionalcomparison ( $a , $b ) $a1 = stringtointvalue ( $a ); $b1 = stringtointvalue ( $b );
if( $a1 > $b1 )return 1 ;
else if( $a1 < $b1 )return - 1 ;
else return 0 ;
>
/*
* e.g. A=1 — B=2 — Z=26 — AA=27 — CZ=104 — DA=105 — ZZ=702 — AAA=703
*/
function stringtointvalue ( $str ) $amount = 0 ;
$strarra = array_reverse ( str_split ( $str ));
for( $i = 0 ; $i < strlen ( $str ); $i ++)$amount +=( ord ( $strarra [ $i ])- 64 )* pow ( 26 , $i );
>
return $amount ;
>
?>
The function will generate an array of integers even if your numerical parameters are enclosed in quotes.
var_dump ( range ( ‘1’ , ‘2’ ) ); // outputs array(2) < [0]=>int(1) [1]=> int(2) >
?>
An easy way to get an array of strings is to map strval() to the range:
var_dump ( array_map ( ‘strval’ , range ( ‘1’ , ‘2’ )) ); // outputs array(2) < [0]=>string(1) «1» [1]=> string(1) «2» >
?>
You might expect range($n, $n-1) to be an empty array (as in e.g. Python) but actually PHP will assume a step of -1 if start is larger than end.
function natural_prime_numbers (array $range , bool $print_info = false ) : array $start_time = time ();
$primes_numbers = array();
$print = » ;
$count_range = count ( $range );
foreach( $range as $number ) $values_division_number = array();
if( $number === 0 || $number === 1 || ! is_int ( $number )) < // eliminate 0, 1 and other no integer
continue;
>
if( $number != 2 && $number % 2 === 0 ) < // eliminate 2 and pairs numbers
continue;
>
for( $i = 1 ; $i <= $number ; $i ++)$resultado_divisao = $number / $i ;
$values_division_number [ $i ] = $resultado_divisao ;
?php>
if( $count_range $print .= PHP_EOL ;
$info = ‘The number ‘ . $number . ‘ divided by the number ‘ . $i . ‘ is equal to: ‘ .( $number / $i );
$print .= $info ;
if( $i === $number ) $print .= PHP_EOL ;
>
>
$values_division_number = array_values ( $values_division_number ); // reindex array
// here we want only array with 2 indexes with the values 1 and own number (rule to a natural prime number)
if( count ( $values_division_number ) === 2 && $values_division_number [ 0 ] === $number && $values_division_number [ 1 ] === 1 ) $primes_numbers [ $number ] = $number ;
>
>
>
return array(
‘length_prime_numbers’ => count ( $primes_numbers ),
‘prime_numbers’ => array_values ( $primes_numbers ),
‘print’ => $print ,
‘total_time_processing’ => ( time () — $start_time ). ‘ seconds.’ ,
);
>
var_dump ( natural_prime_numbers ( range ( 0 , 11 ))); // here the range() function 😉
// Result:
// array (size=3)
// ‘length_prime_numbers’ => int 5
// ‘prime_numbers’ =>
// array (size=5)
// 0 => int 2
// 1 => int 3
// 2 => int 5
// 3 => int 7
// 4 => int 11
// ‘print’ => string ‘
// O número 2 dividido pelo número 1 é igual a: 2
// O número 2 dividido pelo número 2 é igual a: 1
// O número 3 dividido pelo número 1 é igual a: 3
// O número 3 dividido pelo número 2 é igual a: 1.5
// O número 3 dividido pelo número 3 é igual a: 1
// O número 5 dividido pelo número 1 é igual a: 5
// O número 5 dividido pelo número 2 é igual a: 2.5
// O número 5 dividido pelo número 3 é igual a: 1.6666666666667
// O número 5 dividido pelo número 4 é igual a: 1.25
// O número 5 dividido pelo ‘.
// **************************** //
//
// * Remember that the function is recursive, that is: a range of 5000 takes more than 1 minute on a processor Intel® Core™ i5-8250U (3.40 GHz).
//
// **************************** //
?>
Цикл for: работаем с числами
Всем привет! В этом уроке поговорим об еще одном цикле в PHP – for. Он предназначен для случаев, когда нужно работать с числовыми индексами массивов, или же когда нужно осуществлять перебор чисел. Он поначалу кажется более сложным, чем foreach или while, но на самом деле ничего сложного нет.
Выглядит цикл следующим образом:
Как мы видим, есть 3 выражения, которые находятся в круглых скобках. Давайте разберем каждый из них.
- expr1 – это выражение выполняется только один раз перед началом цикла. Здесь обычно происходит определение переменной.
- expr2 – здесь задаётся условие. Если результат этого выражения – true, то цикл выполнится, иначе – закончится. Например, здесь можно проверить, что переменная меньше какого-либо значения.
- expr3 – тут указывается действие, которое будет выполняться в конце каждой итерации цикла. Например – переменная увеличивается на единицу.
Пример можно? Да пожалуйста!
Давайте теперь рассмотрим реальный пример:
Данный код выведет все числа от 0 до 99.
- Итак, перед началом цикла мы определяем переменную $i = 0.
- Затем, перед тем как выполнить цикл, мы проверяем, что переменная $i меньше 100. Если это так, то выполнится тело цикла. А именно – выведется текущее значение переменной и выполнится перенос строки.
- Следующим шагом будет выполнение третьего выражения – инкремент переменной $i.
- Теперь снова будет выполнена проверка условия, что $i < 100. И так далее, пока условие не перестанет выполняться. А если быть точнее – пока $i не станет равной 100. Тут цикл завершит работу.
Есть ещё что-то, что нужно знать?
Стоит отметить, что любое из этих выражений может быть и вовсе пустым. Например, уберем инициализацию переменной из первого выражения и сделаем это перед циклом:
Работать такой код будет так же, как и предыдущий вариант. Просто перед началом цикла не будет ничего выполнено.
Можно убрать и третье выражение, которое выполняется после итерации. Перенесем инкремент внутрь тела цикла и результат получится тот же:
Более того, могут вообще отсутствовать все аргументы. При отсутствии второго аргумента получится бесконечный цикл:
Где это применимо?
Цикл for можно применять там, где требуется перебор чисел, или, например, выполнение определенного числа шагов.
Давайте рассмотрим несколько примеров.
Найти все чётные числа от 1 до 50 и вывести их
Создать массив из 50 случайных значений
Посчитать сумму чисел от 1 до 1000
Как видите, данные задачи элегантно решаются с использованием цикла for. В следующих уроках мы рассмотрим ещё несколько фишек с циклами и научимся реализовывать более сложные алгоритмы. Не забудьте подписаться, чтобы не пропустить новые уроки. А пока поэкспериментируйте с задачами из домашнего задания.
Домашнее задание
Комментарии
Этот урок набрал набрал достаточно большое количество комментариев и дальнейшее его комментирование отключено. Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку, посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали. Если это не помогло — задайте вопрос в чате в телеграме — https://t.me/php_zone