PHP Conference Japan 2024

for

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

Os laços for são os mais complexo no PHP. Possui comportamento semelhante ao C. A sintaxe do laço for é:

for (expr1; expr2; expr3)
    statement

A primeira expressão (expr1) é avaliada (executada), uma vez, incondicionalmente, no início do laço.

No começo de cada iteração a expr2 é avaliada. Se a avaliada como true, o laço continuará e as instruções aninhada serão executadas. Se avaliada como false, a execução do laço terminará.

No final de cada iteração, a expr3 é avaliada (executada).

Cada uma das expressões podem ser vazias ou conter múltiplas expressões separadas por vírgulas. Na expr2, todas as expressões separadas por vírgula são avaliadas mas o resultado é obtido da última parte. Se a expr2 estiver vazia significa que o laço deve ser executado indefinidamente (O PHP considera implicitamente como true, igual ao C). Isto não é inútil como se imagina, pois muitas vezes deseja-se interromper o laço utilizando a instrução break ao invés de usar a expressão verdade do for.

Analise os seguintes exemplos. Todos exibem números de 1 até 10:

<?php
/* exemplo 1 */

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

/* exemplo 2 */

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

/* exemplo 3 */

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

/* exemplo 4 */

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

É claro que o primeiro exemplo aparenta ser o mais simpático (ou talvez o quarto), mas pode-se achar que o uso de expressões vazias no laço for, seja vantajoso em algumas ocasiões.

O PHP também suporta a sintaxe alternativa "dois pontos" para o laço for.

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

É comum, para muitos usuários, iterar em arrays como no exemplo abaixo.

<?php
/*
* Este é um array com alguns dados que devem ser modificados
* durante a execução do loop for.
*/
$pessoas = array(
array(
'nome' => 'Lucas', 'salt' => 856412),
array(
'nome' => 'André', 'salt' => 215863)
);

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

O código acima pode se tornar lento, pois o tamanho do array será calculado a cada iteração. Desde que o tamanho nunca mude, o laço pode ser facilmente otimizado usando uma variável intermediária para armazenar o tamanho ao invés de executar repetidamente o count():

<?php
$pessoas
= array(
array(
'nome' => 'Lucas', 'salt' => 856412),
array(
'nome' => 'André', 'salt' => 215863)
);

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

adicione uma nota

Notas Enviadas por Usuários (em inglês) 2 notes

up
315
matthiaz
12 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
70
nzamani at cyberworldz dot de
23 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).
To Top