for

(PHP 4, PHP 5, PHP 7, PHP 8)

Π¦ΠΈΠΊΠ» for самый слоТный Ρ†ΠΈΠΊΠ» Π² PHP. Π¦ΠΈΠΊΠ» Π²Π΅Π΄Ρ‘Ρ‚ сСбя Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ языку C. Бинтаксис Ρ†ΠΈΠΊΠ»Π° for выглядит Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

for (expr1; expr2; expr3)
    statement

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ expr1 вычисляСтся ΠΈΠ»ΠΈ выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· бСзусловно Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ†ΠΈΠΊΠ»Π°.

Π’ Π½Π°Ρ‡Π°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ оцСниваСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ expr2. Π¦ΠΈΠΊΠ» продолТаСтся, Π° Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ инструкции Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ, Ссли Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π° заканчиваСтся, Ссли Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false.

Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ вычисляСтся ΠΈΠ»ΠΈ выполняСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ expr3.

КаТдоС ΠΈΠ· Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ пустым ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½Π°Π±ΠΎΡ€ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΏΡΡ‚ΡƒΡŽ. Π’ части expr2 ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΡ‚Π΄Π΅Π»ΠΈΠ»ΠΈ запятой, вычисляСтся, Π½ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ бСрётся ΠΈΠ· послСднСго. Π¦ΠΈΠΊΠ» выполняСтся бСсконСчно, Ссли Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ expr2 оставили пустым; PHP нСявно рассматриваСт пустоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с языком C. Π­Ρ‚ΠΎ Π±Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ бСсполСзно, ΠΊΠ°ΠΊ каТСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вмСсто выраТСния истинности Π² спискС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Ρ†ΠΈΠΊΠ»Π° for Ρ†ΠΈΠΊΠ» часто трСбуСтся ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ ΠΏΠΎ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ Π² Ρ‚Π΅Π»Π΅ Ρ†ΠΈΠΊΠ»Π° ΠΏΡƒΡ‚Ρ‘ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° инструкции break.

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ числа ΠΎΡ‚ 1 Π΄ΠΎ 10:

<?php

/* ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1 */

for ($i = 1; $i <= 10; $i++) {
echo
$i;
}

/* ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2 */

for ($i = 1; ; $i++) {
if (
$i > 10) {
break;
}

echo
$i;
}

/* ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3 */

$i = 1;
for (; ; ) {
if (
$i > 10) {
break;
}

echo
$i;
$i++;
}

/* ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4 */

for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);

?>

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ каТСтся самым красивым (ΠΈΠ»ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€Ρ‚Ρ‹ΠΉ), Π½ΠΎ программисты часто находят пустыС выраТСния Π² Ρ†ΠΈΠΊΠ»Π°Ρ… for ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ.

PHP Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ для Ρ†ΠΈΠΊΠ»ΠΎΠ² for Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ синтаксис с Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ.

for (expr1; expr2; expr3):
    statement
    ...
endfor;

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ массивы стандартным способом, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ.

<?php

/**
* Π­Ρ‚ΠΎ массив с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ трСбуСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ
* Π² Ρ†ΠΈΠΊΠ»Π΅
*/
$people = array(
array(
'name' => 'Kalle', 'salt' => 856412),
array(
'name' => 'Pierre', 'salt' => 215863)
);

for (
$i = 0; $i < count($people); ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}

?>

ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈΠ½ΠΎΠ³Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€ массива вычисляСтся Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π΅ мСняСтся, Ρ†ΠΈΠΊΠ» Π»Π΅Π³ΠΊΠΎ оптимизируСтся Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ записываСтся Ρ€Π°Π·ΠΌΠ΅Ρ€ массива, вмСсто ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ count():

<?php

$people
= array(
array(
'name' => 'Kalle', 'salt' => 856412),
array(
'name' => 'Pierre', 'salt' => 215863)
);

for(
$i = 0, $size = count($people); $i < $size; ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}

?>
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 2 notes

up
335
matthiaz ΒΆ
14 years ago
Looping through letters is possible. I'm amazed at how few people know that.

for($col = 'R'; $col != 'AD'; $col++) {
    echo $col.' ';
}

returns: R S T U V W X Y Z AA AB AC

Take note that you can't use $col < 'AD'. It only works with !=
Very convenient when working with excel columns.
up
69
nzamani at cyberworldz dot de ΒΆ
24 years ago
The point about the speed in loops is, that the middle and the last expression are executed EVERY time it loops.
So you should try to take everything that doesn't change out of the loop.
Often you use a function to check the maximum of times it should loop. Like here:

<?php
for ($i = 0; $i <= somewhat_calcMax(); $i++) {
  somewhat_doSomethingWith($i);
}
?>

Faster would be:

<?php
$maxI = somewhat_calcMax();
for ($i = 0; $i <= $maxI; $i++) {
  somewhat_doSomethingWith($i);
}
?>

And here a little trick:

<?php
$maxI = somewhat_calcMax();
for ($i = 0; $i <= $maxI; somewhat_doSomethingWith($i++)) ;
?>

The $i gets changed after the copy for the function (post-increment).