Estructuras de control

Un programa PHP se ejecuta en principio de forma secuencial, desde la primera instrucción hasta la última y de una en una. Las estructuras de control permiten modificar este flujo, eligiendo entre instrucciones alternativas o repitiendo instrucciones.

Bloques de instrucciones

Para indicar a PHP que varias instrucciones forman un bloque de instrucciones que se ejecutarán secuencialmente (aunque un bloque pueda a su vez contener estructuras de control), se utilizan las llaves { y }.

Desaconsejado
<?php
{
print "<p>Hola</p>\n";
print "<p>Adios</p>\n";
}
?>
<p>Hola</p>
<p>Adios</p>
Desaconsejado
<?php
{ print "<p>Hola</p>\n"; print "<p>Adios</p>\n"; }
?>
<p>Hola</p>
<p>Adios</p>

La guía de estilo PER Coding Style recomienda sangrar con cuatro espacios las instrucciones que formen el bloque y escribir las llaves en líneas distintas de las instrucciones del bloque.

Correcto
<?php
{
    print "<p>Hola</p>\n";
    print "<p>Adios</p>\n";
}
?>
<p>Hola</p>
<p>Adios</p>

No es necesario escribir un punto y coma (;) después de las llaves y, en general, se recomienda no hacerlo.

Desaconsejado
<?php
{
    print "<p>Hola</p>\n";
    print "<p>¿Qué tal?</p>\n";
};
print "<p>Adios</p>\n";
?>
<p>Hola</p>
<p>¿Qué tal?</p>
<p>Adios</p>
Correcto
<?php
{
    print "<p>Hola</p>\n";
    print "<p>¿Qué tal?</p>\n";

print "<p>Adios</p>\n";
?>
<p>Hola</p>
<p>¿Qué tal?</p>
<p>Adios</p>

Los bloques de instrucciones se emplean en las estructuras de control que se comentan en esta página (if ... elseif ... else, for, while, do ... while o foreach). No se suelen utilizar bloques cuando no hay estructuras de control. Si se quiere indicar visualmente al programador que unas instrucciones están relacionadas entre sí, basta con dejar una línea en blanco en el código fuente ...

<?php
print "<p>Hola</p>\n";
print "<p>¿Qué tal?</p>\n";

print "<p>Recuerdos a la familia</p>\n";
print "<p>Adios</p>\n";
?>
<p>Hola</p>
<p>¿Qué tal?</p>
<p>Recuerdos a la familia</p>
<p>Adios</p>

... o añadir líneas de comentarios:

<?php
// Saludo
print "<p>Hola</p>\n";
print "<p>¿Qué tal?</p>\n";

// Despedida
print "<p>Recuerdos a la familia</p>\n";
print "<p>Adios</p>\n";
?>
<p>Hola</p>
<p>¿Qué tal?</p>
<p>Recuerdos a la familia</p>
<p>Adios</p>

Sentencia condicional if ... elseif ... else ...

Nota: En la lección Sentencia condicional if ... elseif ... else ... se explica con más detalle esta estructura de control.

Las construcciones if, else y elseif permite condicionar la ejecución de un bloque de sentencias al cumplimiento de una condición.

La sintaxis de la construcción if más sencilla es la siguiente:

if (condición) {
    bloque_de_sentencias
}

La condición se evalúa siempre, si el resultado es true se ejecuta el bloque de sentencias y si el resultado es false no se ejecuta el bloque de sentencias.


La construcción if se puede complicar añadiendo la instrucción else:

if (condición) {
    bloque_de_sentencias_1
} else {
    bloque_de_sentencias_2
}

La condición se evalúa siempre, si el resultado es true se ejecuta solamente el bloque de sentencias 1 y si el resultado es false se ejecuta solamente el bloque de sentencias 2.


La construcción if ... else se puede extender añadiendo la instrucción elseif:

if (condición_1) {
    bloque_de_sentencias_1
} elseif (condición_2) {
    bloque_de_sentencias_2
} else {
    bloque_de_sentencias_3
}

La condición 1 se evalúa siempre, si el resultado es true se ejecuta solamente el bloque de sentencias 1 y solamente si el resultado es false se evalúa la condición 2, si el resultado de esta es true se ejecuta solamente el bloque de sentencias 2 y si el resultado es false se ejecuta solamente el bloque de sentencias 3. En cualquier caso solamente se ejecuta uno de los tres bloques de sentencias.


Se pueden añadir tantas instrucciones elseif como se desee, teniendo en cuenta que en cualquier caso solamente se ejecuta uno de los bloques de sentencias.

if (condición_1) {
    bloque_de_sentencias_1
} elseif (condición_2) {
    bloque_de_sentencias_2
} elseif (condición_3) {
    bloque_de_sentencias_3
 ...
} elseif (condición_n) {
    bloque_de_sentencias_n
} else {
    bloque_de_sentencias_n+1
}

Operador ternario: .. ? ... : ...

Si la construcción if ... else ... simplemente asigna valor a una variable ...

if (condición_1) {
    $variable = expresión_1;
} else
    $variable = expresión_2;
}

... se puede sustituir por la construcción:

$variable = condición_1 ? expresión_1 : expresión_2;

que si las expresiones son muy largas se puede escribir en varias líneas para facilitar la legibilidad:

$variable = (condición_1)
    ? expresión_1
    : expresión_2;

Sentencia condicional switch

La sentencia switch es equivalente a una construcción if ... elseif ... en las que las expresiones son comparaciones de igualdad de la misma condición con valores distintos.

La sintaxis de la sentencia switch es la siguiente:

switch (expresión_1) {
    case valor_1:
        bloque_de_sentencias_1;
        break;
    case valor_2:
        bloque_de_sentencias_2;
        break;
    ...
    case valor_n:
        bloque_de_sentencias_n;
        break;
}

que es equivalente a :

if (expresión_1 == valor_1) {
    bloque_de_sentencias_1
} elseif (expresión_1 == valor_2) {
    bloque_de_sentencias_2
} elseif (expresión_1 == valor_3) {
    bloque_de_sentencias_3
} ... {
    ...
} elseif (expresión_1 == valor_n) {
    bloque_de_sentencias_n
}

Bucle for

Nota: En la lección Bucle for se explica con más detalle esta estructura de control.

La sintaxis del bucle for es la siguiente:

for (expresión_inicial; condición_continuación; expresión_paso) {
    bloque_de_sentencias
}

La expresión inicial se evalúa siempre. La condición de continuación se evalúa al principio de cada iteración: si el resultado es true se ejecuta primero el bloque de sentencias, después la expresión de paso y finalmente se evalúa nuevamente la condición de continuación; si el resultado es false el bucle se termina.

Cuando se programa un bucle for hay que tener cuidado en que la condición de continuación vaya a dejar de cumplirse en algún momento, porque si no es así, el bucle no terminaría nunca.


En los bucles for más sencillos, en la expresión inicial se inicializa una variable que se evalúa en la expresión final y que se modifica en la expresión de paso, como muestra el ejemplo siguiente:

<?php
for ($i = 0; $i < 5; $i++) {
    print "<p>$i</p>\n";
}
?>
<p>0</p>
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>

Bucle while

La sintaxis del bucle while es la siguiente:

while (condición) {
    bloque_de_sentencias
}

La condición se evalúa al principio de cada iteración: si el resultado es true se ejecuta el bloque de sentencias; si el resultado es false el bucle se termina.

INICIO CONDICIÓN true BLOQUE false FIN


Cuando se programa un bucle while hay que tener cuidado en que la condición deje de cumplirse en algún momento, porque si no es así, el bucle no terminaría nunca.


En los bucles while más sencillos, antes del bucle se inicializa una variable que se evalúa en la condición y dentro del bucle se modifica la variable, como muestra el ejemplo siguiente:

<?php
$i = 0;
while ($i < 5) {
    print "<p>$i</p>\n";
    $i++;
}
?>
<p>0</p>
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>

Bucle do ... while

La sintaxis del bucle do ... while es la siguiente:

do {
    bloque_de_sentencias
} while (condición)

La condición se evalúa al final de cada iteración: si el resultado es true se ejecuta el bloque de sentencias; si el resultado es false el bucle se termina.

INICIO BLOQUE CONDICIÓN true false FIN


El bucle do ... while es muy similar al bucle while, la principal diferencia es que en el bucle do ... while el bloque de sentencias se ejecuta por lo menos una vez mientras que en el bucle while depende de si la condición es cierta o no la primera vez que se evalúa.

Cuando se programa un bucle do ... while hay que tener cuidado en que la condición deje de cumplirse en algún momento, porque si no es así, el bucle no terminaría nunca.


En los bucles do ... while más sencillos, antes del bucle se inicializa una variable que se evalúa en la condición y dentro del bucle se modifica la variable, como muestra el ejemplo siguiente:

<?php
$i = 0;
do {
    print "<p>$i</p>\n";
    $i++;
} while ($i < 5)
?>
<p>0</p>
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>

Bucle foreach

Nota: En la lección Bucle foreach se explica con más detalle esta estructura de control.

El bucle foreach es muy útil para recorrer matrices cuyo tamaño se desconoce o matrices cuyos índices no son correlativos o numéricos (matrices asociativas).


La sintaxis del bucle foreach más simple es la siguiente:

foreach ($matriz as $valor) {
    bloque_de_sentencias
}

El bucle ejecuta el bloque de sentencias tantas veces como elementos contenga la matriz $matriz y, en cada iteración, la variable $valor toma uno de los valores de la matriz.

En el ejemplo siguiente se define una matriz y se imprimen sus valores:

<?php
$matriz = [0, 1, 10, 100, 1000];
foreach ($matriz as $valor) {
    print "<p>$valor</p>\n";
}
?>
<p>0</p>
<p>1</p>
<p>10</p>
<p>100</p>
<p>1000</p>

La sintaxis del bucle foreach puede también ser la siguiente:

foreach ($matriz as $indice => $valor) {
    bloque_de_sentencias
}

El bucle ejecuta el bloque de sentencias tantas veces como elementos contenga la matriz $matriz y, en cada iteración, la variable $valor toma uno de los valores de la matriz y la variable $indice toma como valor el índice correspondiente. Esta construcción es muy útil

En el ejemplo siguiente se define una matriz asociativa y se imprimen sus valores:

<?php
$matriz = ["red" => "rojo", "green" => "verde", "blue" => "azul"];
foreach ($matriz as $indice => $valor) {
    print "<p>$indice : $valor</p>\n";
}
?>
<p>red : rojo</p>
<p>green : verde</p>
<p>blue : azul</p>