Decisiones y ciclos
if, foreach y las comparaciones que no hacen lo que crees
Marco González Luengo
Tabla de contenidos
Las estructuras de control son las mismas que ya conoces. Cambia la ropa (llaves y paréntesis) y aparecen un par de trampas con las comparaciones.
if, elseif, else
<?php
$nota = 5.5;
if ($nota >= 6.0) {
echo "Excelente", PHP_EOL;
} elseif ($nota >= 4.0) {
echo "Aprobado", PHP_EOL;
} else {
echo "Reprobado", PHP_EOL;
}
- La condición va entre paréntesis y el bloque entre llaves.
- Es
elseif, todo junto, noelif. - Más en el manual de
if.
Y, o, no: &&, ||, !
Los operadores lógicos son && (y), || (o) y ! (no). PHP también tiene and y or, pero con una precedencia tan baja que hacen cosas raras:
<?php
$conAnd = true and false; // se lee como: ($conAnd = true) and false
$conAmp = true && false;
var_dump($conAnd); // true (!)
var_dump($conAmp); // false
Moraleja: usa siempre &&, || y !.
== contra ===
Esta es de las importantes. == convierte los tipos antes de comparar (lo que se conoce como type juggling), y eso da resultados sorprendentes. === compara valor y tipo, sin conversiones:
<?php
var_dump("0" == false); // true (!)
var_dump("0" === false); // false
var_dump("1" == "01"); // true: los compara como números
var_dump("1" === "01"); // false: son textos distintos
var_dump(null == false); // true
var_dump(null === false); // false
Usa siempre === y !==, salvo que tengas una muy buena razón. Si te da curiosidad lo que hace ==, el manual tiene una tabla completa de comparaciones que da un poco de miedo.
foreach
foreach es el for ... in de Python: recorre los elementos de un array.
<?php
$notas = [6.0, 5.5, 4.8];
foreach ($notas as $n) {
echo "Nota: {$n}", PHP_EOL;
}
// range() arma un array con una secuencia, como range() en Python
foreach (range(1, 5) as $i) {
echo $i, " ";
}
Ojo con el orden: en PHP es foreach ($coleccion as $elemento), al revés que en Python. La función range incluye ambos extremos: range(1, 5) llega hasta el 5.
for y while
También están for al estilo C y while:
<?php
for ($i = 0; $i < 3; $i++) {
echo "Vuelta {$i}", PHP_EOL;
}
$cuenta = 3;
while ($cuenta > 0) {
echo "Quedan {$cuenta}", PHP_EOL;
$cuenta--;
}
Para recorrer arrays, casi siempre conviene foreach.
Sigue con Arrays.