Diferencia entre revisiones de «Plantilla:PHP/EstructurasControl»

De WikiEducator
Saltar a: navegación, buscar
(Estructuras de control)
(Seleccion switch)
 
(29 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
<div class="slide">
+
 
 
==Estructuras de control==
 
==Estructuras de control==
 
{{MRM_Objetivos|
 
{{MRM_Objetivos|
Línea 25: Línea 25:
 
|+ style="background:DarkSlateBlue; color:white; text-align:center;"|'''Resumen de las estructurasd e control'''
 
|+ style="background:DarkSlateBlue; color:white; text-align:center;"|'''Resumen de las estructurasd e control'''
 
|- style="background:Lavender; color:black"
 
|- style="background:Lavender; color:black"
! width="60 px" |Tipo de Estructura de control
+
! width="50 px" |Tipo de Estructura de control
! width="100 px" |Sintáxis en php
+
! width="80 px" |Sintáxis en php
! width="100 px" |Ejemplo
+
! width="80 px" |Ejemplo
 
|-
 
|-
 
|Secuencial
 
|Secuencial
Línea 90: Línea 90:
 
|}
 
|}
  
 +
===Secuencial===
 +
*Con esta estrucutra de control, lo que estamos especificando es que se ejecuta una instrucción detras de otra de forma seguida, por lo que el flujo de control es secuancial
 +
[[Archivo:secuencial.png|center]]
  
 
+
===Selección if===
 
+
*Sentencia que evalúa una expresión booleana y ejecuta o no en función de que dicha expresión sea true o false
 
+
<source lang=php>
    ===Secuencial===
+
if (expresion_booleana)
    *Con esta estrucutra de control, lo que estamos especificando es que se ejecuta una instrucción detras de otra de forma seguida, por lo que el flujo de control es secuancial
+
    [[Archivo:secuencial.png|center]]
+
 
+
    ===Selección if===
+
    *Sentencia que evalúa una expresión booleana y ejecuta o no en función de que dicha expresión sea true o false
+
    <source lang=php>
+
    if (expresion_booleana)
+
 
     Sentencia 1;
 
     Sentencia 1;
    </source>
+
</source>
    <hr>
+
<hr>
    *En caso de haber más de una setencia, obligatoriamente debemos de poner las llaves especificando el bloque de sentencias
+
*En caso de haber más de una setencia, obligatoriamente debemos de poner las llaves especificando el bloque de sentencias
    <source lang=php>
+
<source lang=php>
    if  (expresion_booleana ){
+
if  (expresion_booleana ){
 
     Sentencia_1;
 
     Sentencia_1;
 
     Sentencia_2;
 
     Sentencia_2;
    }
+
}
    </source>
+
</source>
  
  
   
+
*Podemos ver su lógica en la imagen siguiente
        *Podemos ver su lógica en la imagen siguiente
+
[[Archivo:estructura_if.png|center]]
        [[Archivo:estructura_if.png|center]]
+
  
  
 
          
 
          
 +
;Sentencias de control
 +
<source lang=php>
 +
if  (expresion_booleana)
 +
{
 +
    bloque_de_sentencias_1;
 +
}
 +
    else
 +
{
 +
bloque_de_sentencias_2;
 +
}
 +
</source>
  
            ;Sentencias de control
+
*Podemos ver su lógica en la imagen siguiente
            <source lang=php>
+
[[Archivo:estructura_if_else.png|center]]
            if  (expresion_booleana)
+
            {
+
            bloque_de_sentencias_1;
+
            }
+
            else
+
            {
+
            bloque_de_sentencias_2;
+
            }
+
            </source>
+
           
+
                *Podemos ver su lógica en la imagen siguiente
+
                [[Archivo:estructura_if_else.png|center]]
+
  
  
                *También existe la opción '''''elseif''''' donde aportaremos una condición que se ha de cumplir para que se ejecuten las sentencias que a continuación acompañan.
+
*También existe la opción '''''elseif''''' donde aportaremos una condición que se ha de cumplir para que se ejecuten las sentencias que a continuación acompañan.
                *Se garantiza que solo se va a ejecutar '''''un bloque de instrucciones'''''.
+
*Se garantiza que solo se va a ejecutar '''''un bloque de instrucciones'''''.
  
               
 
                    ;Estructura de control
 
                    <source lang=php>
 
                    if (expresion_booleana_1)
 
                    {
 
                    bloque_sentencias_1;
 
                    }
 
                    elseif (expresion_booleana_2){
 
                    bloque_sentencias_2
 
                    }
 
                    elseif (expresion_booleana_3){
 
                    bloque_sentencias_3
 
                    }
 
                    elseif (expresion_booleana_4){
 
                    bloque_sentencias_4
 
                    }
 
                    else{
 
                    bloque_sentencia_5  ;
 
                    }
 
                    sentencia_6
 
  
                    </source>
+
;Estructura de control
 +
<source lang=php>
 +
if (expresion_booleana_1)
 +
{
 +
bloque_sentencias_1;
 +
}
 +
elseif (expresion_booleana_2){
 +
bloque_sentencias_2
 +
}
 +
elseif (expresion_booleana_3){
 +
bloque_sentencias_3
 +
}
 +
elseif (expresion_booleana_4){
 +
bloque_sentencias_4
 +
}
 +
else{
 +
bloque_sentencia_5  ;
 +
}
 +
sentencia_6
  
                    *Podemos ver su lógica en la imagen siguiente
+
</source>
                    [[Archivo:estructura_if_elseif.png|center]]
+
  
 +
*Podemos ver su lógica en la imagen siguiente
 +
[[Archivo:estructura_if_elseif.png|center]]
  
                   
 
                        *Alternativamente puede usarse esta sintaxis que es usada cuando se quiere intercalar condigo html fuera del php como veremos más adelante.
 
                        *También se puede usar la sintaxis  vista anteriormente, pero parece que esta quede más compacta.
 
  
                        <source lang=php>
 
                        if (condicion):
 
                        Sentencia 1;
 
                        endif;
 
                        </source>
 
  
 +
*Alternativamente puede usarse esta sintaxis que es usada cuando se quiere intercalar condigo html fuera del php como veremos más adelante.
 +
*También se puede usar la sintaxis  vista anteriormente, pero parece que esta quede más compacta.
  
                       
+
<source lang=php>
                            ;Ahora lo vemos con código html
+
if (condicion):
                            <source lang=php>
+
Sentencia 1;
                            <?php if (true): ?>
+
endif;
 +
</source>
  
                                <h1>Esta frase seguro que aparece ahor</h1>
 
                                <!--escribirmos código html -->
 
                            <?php else: ?>
 
                                <h1>Aquí escribiré poco ya que no va a aparecer nada</h1>
 
                                <!--escribimos código html -->
 
                            <?php endif ?>
 
                            </source>
 
  
  
                           
+
;Ahora lo vemos con código html
 +
<source lang=php>
 +
<?php if (true): ?>
  
                                ===Operadores ternario===
+
    <h1>Esta frase seguro que aparece ahor</h1>
                                *Es una forma más compacta de expresar un '''''if-else''''' en una única instrucción.
+
    <!--escribirmos código html -->
                                *Esta instrucción se conoce como '''''operador ternario''''', y retorna un valor
+
<?php else: ?>
                                <source lang=php>
+
    <h1>Aquí escribiré poco ya que no va a aparecer nada</h1>
                                expresión_booleana ? SentenciaOKExpresion : SentenciaNoOkExpresion
+
    <!--escribimos código html -->
                                </source>
+
<?php endif ?>
                                *El valor que retorna es el que se obtenga de ejecutar la '''Sentencia''' correspondiente.
+
</source>
                                *Esta '''''expresión''''' retorna un valor, y es este sentido es sinónimo de
+
                                <source lang=php>
+
                                if (expresión_booleana)
+
                                SentenciaOKExpresion
+
                                else
+
                                SentenciaNoOkExpresion
+
                                </source>
+
  
                                {{MRM_Actividad|Programa que me diga si un número aleatorio es par o impar!
+
=== Operador Ternario ===
 +
*El '''operador ternario''' es una forma más compacta de expresar una estructura '''if-else''' en una única línea, ideal cuando se desea evaluar una condición y devolver un valor en función del resultado.
 +
*Esta expresión retorna un valor según la condición especificada.
  
                                {{Plegable|hide|Programa par o impar con operador ternario|
+
<source lang=php>
                                <source lang=php>
+
(expresión_booleana) ? valor_si_true : valor_si_false;
                                    <?php
+
</source>
                                    $num= rand(1,100);
+
                                    echo ($num%2==0)? "$num es par" : "$num es impar";
+
                                    ?>
+
                                </source>
+
  
                                }}
+
*El valor que retorna es el resultado de la '''expresión''' que corresponda según el valor de la condición. Esta expresión es equivalente a:
                                {{Plegable|hide|Programa par o impar con estructura de control if-else|
+
 
                                <source lang=php>
+
<source lang=php>
                                    <?php
+
if (expresión_booleana)
                                    $num= rand(1,100);
+
    valor_si_true;
                                    if ($num%2==0)
+
                                        echo  "$num es par"
+
 
else
 
else
     echo  "$num es impar";
+
     valor_si_false;
                                    ?>
+
</source>
                                </source>
+
                                }}
+
                                }}
+
  
 +
*Usar el operador ternario ayuda a escribir el código de forma más compacta y clara, especialmente en expresiones sencillas.
  
                               
+
==== Ejemplo ====
                                    <br />
+
<br />
                                    *Este '''''operador''''' se usa mucho en programación, por lo que conviene entenderlo y habituarse a su uso.
+
{{MRM_Actividad|Determinar si un número aleatorio es par o impar}}
  
                                    <br />
+
{{Plegable|hide|Operador ternario|
 +
Programa para par o impar con operador ternario
 +
<source lang=php>
 +
<?php
 +
$num = rand(1, 100);
 +
echo ($num % 2 == 0) ? "$num es par" : "$num es impar";
 +
?>
 +
</source>
 +
}}
  
                                    ===Seleccion switch===
+
{{Plegable|hide|Estructura if-else|
                                    *Este es un selector múltiple.
+
Programa para par o impar con estructura if-else
                                    *La sentencia case en '''''php''''' puede albergar cualquier valor de un tipo simple, no está limitado a enteros como en otros lenguajes
+
<source lang=php>
                                    *Esta estructura estáindicada cuanto tengamos más de dos casos ante una variable o situación que evaluemos excluyentes entre sí.
+
<?php
 +
$num = rand(1, 100);
 +
if ($num % 2 == 0) {
 +
    echo "$num es par";
 +
} else {
 +
    echo "$num es impar";
 +
}
 +
?>
 +
</source>
 +
}}
  
                                    *La sintaxis de esta  estructura  de control es
+
<br />
                                    <source lang=php>
+
*Este '''operador ternario''' se utiliza mucho en programación, y conviene entenderlo y habituarse a su uso para escribir código más conciso y claro.
                                    switch ($valor){
+
                                    case: "valor1":
+
                                    acciones
+
                                    break;
+
                                    case: "valor1":
+
                                    acciones
+
                                    break;
+
                                    case: "valor1":
+
                                    acciones
+
                                    break;
+
                                    default:
+
                                    acciones si no hay coincidencia anterior
+
                                    }
+
                                    </source>
+
                                    *La ejecución de esta sentencia de control, busca la primera coincidencia de '''''$valor''''' con  los difentes '''''case'''''.
+
                                    *Posteriormente ejecutaría todas las instruciones hasta que encuentre un '''''break'''''.
+
                                    *En caso de no haber break en el case correspondiente ejecutaría el código de los difernetes '''''case''''' hasta que llege al final de la estructura o bien ejecute una instrución '''''break''''' .
+
  
                                   
+
=== Selección con `switch` ===
                                        ;Switch
+
*El operador '''switch''' es un selector múltiple que permite evaluar el valor de una variable o expresión y ejecutar el bloque de código correspondiente al primer caso que coincida.
                                        {{MRM_Ejemplo|Title=uso de switch|
+
*En PHP, la sentencia `case` puede albergar valores de cualquier tipo simple (números, cadenas, etc.), no está limitada a enteros como en otros lenguajes.
                                        *Hacer un programa que nos muestre si un nombre es María, Pedro, o no es ninguno de ellos
+
*Esta estructura es útil cuando tenemos múltiples casos excluyentes y queremos evitar múltiples `if-else`.
  
                                        {{Plegable|hide|Posible solución|
+
==== Sintaxis ====
                                        <source lang=php>
+
La sintaxis básica de un `switch` en PHP es:
                                            <?php
+
<source lang=php>
                                            switch ($nombre){
+
switch ($valor) {
                                                case "Maria":
+
    case "valor1":
                                                    echo "eres una chica";
+
        // acciones
                                                    break;
+
        break;
                                                case "Pedro";
+
    case "valor2":
                                                    echo "eres una chico";
+
        // acciones
                                                    break;
+
        break;
                                                default:
+
    case "valorn":
                                                    echo "no se qué nombre tienes";
+
        // acciones
                                            }
+
        break;
                                            ?>
+
    default:
                                        </source>
+
        // acciones si no hay coincidencia
                                        }}
+
}
                                        }}
+
</source>
  
                                        {{MRM_Actividad|Title=Generar mes y mostrar número de días|
+
==== Notas Importantes ====
                                        *Hacer un programa que muestre el número de días que tiene un més
+
*El `switch` busca la primera coincidencia de `$valor` con los valores de los casos (`case`) y ejecuta todas las instrucciones posteriores hasta encontrar un `break`.
                                        *El número de mes se obtendrá en un valor aleatorio entre 1 y 15
+
*Si no se coloca un `break`, continuará ejecutando los casos siguientes, incluso si no coinciden.
                                        *El programa me mostrará el número de días y si el mes no es correcto me informará de ello
+
  
 +
==== Ejemplo Básico ====
 +
{{MRM_Ejemplo|Title=Ejemplo: Identificar un Nombre|
 +
*Escribe un programa que evalúe si una variable `$nombre` es "María", "Pedro", o cualquier otro nombre.
  
                                        {{Plegable|hide|Posible solución|
+
{{Plegable|hide|Posible Solución|
 +
<source lang=php>
 +
<?php
 +
$nombre = "Pedro";
  
                                        <source lang=php>
+
switch ($nombre) {
                                            <?php
+
    case "María":
 +
        echo "Eres una chica";
 +
        break;
 +
    case "Pedro":
 +
        echo "Eres un chico";
 +
        break;
 +
    default:
 +
        echo "No sé qué nombre tienes";
 +
}
 +
?>
 +
</source>
 +
}}
 +
}}
  
                                            //Generamos un número de mes
+
==== Ejemplo con Rango de Valores ====
                                            $mes = rand(1, 20);
+
*En algunos casos, queremos evaluar rangos de valores (por ejemplo, edades, calificaciones). En PHP, esto se logra usando expresiones booleanas dentro de los `case` y configurando el `switch` para evaluar `true`.
  
                                            //Evaluamos en número de días del mes generado
+
{{MRM_Ejemplo|Title=Ejemplo: Nivel de Madurez|
 +
*Generar una edad aleatoria entre 0 y 110 y clasificarla según el nivel de madurez:
  
                                            switch ($mes) {
+
  - 0–2: Bebé
                                                case 1:
+
  - 3–10: Niñez
                                                case 3:
+
  - 11–17: Adolescencia
                                                case 5:
+
  - 18–26: Juventud
                                                case 7:
+
  - 27–59: Adultez
                                                case 8:
+
  - 60–80: Experimentado
                                                case 10:
+
  - Más de 80: Disfrutando la vida
                                                case 12:
+
                                                    echo "$mes, mes de 31 días";
+
                                                    break;
+
  
                                                case 4:
+
{{Plegable|hide|Posible Solución|
                                                case 6:
+
<source lang=php>
                                                case 10:
+
<?php
                                                case 11:
+
$edad = rand(0, 110);
                                                    echo "$mes, mes de 30 días";
+
                                                    break;
+
                                                case 2:
+
                                                    echo "$mes, mes de 29 o 28 días";
+
                                                    break;
+
                                                default:
+
                                                    echo "$mes, mes incorrecto ";
+
                                            }
+
                                            ?>
+
                                        </source>
+
                                        }}
+
  
                                        }}
+
switch (true) {
 +
    case ($edad >= 0 && $edad <= 2):
 +
        echo "Con $edad años: Eres un bebé";
 +
        break;
 +
    case ($edad >= 3 && $edad <= 10):
 +
        echo "Con $edad años: Estás en la niñez";
 +
        break;
 +
    case ($edad >= 11 && $edad <= 17):
 +
        echo "Con $edad años: Estás en la adolescencia";
 +
        break;
 +
    case ($edad >= 18 && $edad <= 26):
 +
        echo "Con $edad años: Eres joven";
 +
        break;
 +
    case ($edad >= 27 && $edad <= 59):
 +
        echo "Con $edad años: Eres adulto";
 +
        break;
 +
    case ($edad >= 60 && $edad <= 80):
 +
        echo "Con $edad años: Eres experimentado";
 +
        break;
 +
    default:
 +
        echo "Con $edad años: Disfruta la vida";
 +
}
 +
?>
 +
</source>
 +
}}
 +
}}
  
 +
==== Casos Curiosos en PHP ====
 +
En PHP, al comparar rangos o expresiones booleanas dentro de un `case`, se recomienda configurar el `switch` para evaluar `true`. Esto evita errores de interpretación con valores como `0`.
  
                                        *Vamos a observar una situación curiosa de php en esta estructura de control
+
**Ejemplo Problemático**:
                                        *Supongamos que queremos evaluar el valor de una nota, un valor entero y compararlo con rangos de valores, según se expone a continuación
+
<source lang=php>
                                        0-3 deficiente
+
<?php
                                        4  insuficiente
+
$nota = 0;
                                        5  suficiente
+
                                        6  bien
+
                                        7-8 notable
+
                                        9-10 sobresaliente
+
                                        *Si hacemos el programa como se expone a continuación, aparentemente vemos que funciona
+
                                        <source lang=php>
+
                                        $nota = rand (0,10);
+
  
 +
switch ($nota) {
 +
    case ($nota >= 0 && $nota <= 3):
 +
        echo "Nota deficiente";
 +
        break;
 +
    case 4:
 +
        echo "Nota insuficiente";
 +
        break;
 +
    case 5:
 +
        echo "Nota suficiente";
 +
        break;
 +
    case ($nota > 6 && $nota < 9):
 +
        echo "Nota notable";
 +
        break;
 +
    case ($nota >= 9):
 +
        echo "Nota sobresaliente";
 +
        break;
 +
}
 +
?>
 +
</source>
  
                                        switch ($nota){
+
*Si `$nota = 0`, el primer caso no se ejecuta porque PHP convierte `0` a booleano `false`, lo que genera errores lógicos.
                                        case ($nota>=0 and $nota<=3):
+
                                        echo "<h1>Nota $nota es  deficiente</h1>";
+
                                        break;
+
                                        case 4:
+
                                        echo "<h1>Nota $nota es  insuficiente</h1>";
+
                                        break;
+
                                        case 5:
+
                                        echo "<h1>Nota $nota es  suficiente</h1>";
+
                                        break;
+
                                        case 6:
+
                                        echo "<h1>Nota $nota es  bien</h1>";
+
                                        break;
+
                                        case ($nota>6 and $nota<9):
+
                                        echo "<h1>Nota $nota es  notable</h1>";
+
                                        break;
+
                                        case ($nota>=9):
+
                                        echo "<h1>Nota $nota es  sobresalinte</h1>";
+
                                        break;
+
                                        }
+
                                        ?>
+
  
                                        </source>
+
**Solución Recomendada**:
                                        *Pero observa que si $nota vale 0, no está funcionando correctamente
+
<source lang=php>
                                        *Esto es por que en php estoy comparando valores de diferente tipo y realiza una conversión, ('''''de nuevo queda patente la expresividad de php''''')
+
<?php
                                        *Si la expresión del case es un valor booleano, el valor $nota, se convierte a booleano
+
$nota = rand(0, 10);
                                        *Si el valor es 0, lo voy comparando con las difernetes expresione. Vemos qué ocurre en este caso ($nota =0):
+
                                        *1.-Primer case:  '''''case ($nota>=0 and $nota<=3)'''''
+
                                        Esta expresión da TRUE, ya que nota es >=0.
+
                                        entonces estoy comparando 0 con TRUE. Convierto 0 a booleano y estaría comparando FALSE con TRUE
+
                                        que es falso, por lo que no ejectua este case
+
                                        *2.-Segundo case  '''''case 4'''''
+
                                        En este caso  comparo 0 con 4 que es FALSE, por lo que tampoco ejecuto este case
+
                                        *3.-Tercer y cuarto case, igual que el segundo
+
                                        *4.-Quinto  case:  '''''case ($nota>6 and $nota<9)'''''
+
                                        En este caso la expresión devuelve FALSE, ya que 0 no es mayor que 6 ni menor que 9, por lo que
+
                                        comparo 0 con FALSE. Se convierte 0 a booleano y compararía FALSE con FALSE, que como es igual
+
                                        me retorno TRUE y ejecutaría este case.
+
                                       
+
                                            Para solucionar esta situación, en php lo que debemos hacer es buscar una expresión que sea TRUE, por lo que en los diferentes '''''case''''' debemos especificar expresiones booleanas de forma que aquella que sea TRUE es la que queremos que se ejecute. Esto implicaría poner el valor TRUE en el switch. Veamos cómo queda en el código
+
                                            <source lang=php>
+
                                            $nota = rand (0,10);
+
  
 +
switch (true) {
 +
    case ($nota >= 0 && $nota <= 3):
 +
        echo "Nota deficiente";
 +
        break;
 +
    case $nota == 4:
 +
        echo "Nota insuficiente";
 +
        break;
 +
    case $nota == 5:
 +
        echo "Nota suficiente";
 +
        break;
 +
    case $nota == 6:
 +
        echo "Nota bien";
 +
        break;
 +
    case ($nota >= 7 && $nota <= 8):
 +
        echo "Nota notable";
 +
        break;
 +
    case ($nota >= 9):
 +
        echo "Nota sobresaliente";
 +
        break;
 +
}
 +
?>
 +
</source>
  
                                            switch (TRUE){
+
==== Actividad Propuesta ====
                                            case ($nota>=0 and $nota<=3):
+
*Generar un número aleatorio para el mes (entre 1 y 12) y mostrar el número de días correspondientes. Si el número no corresponde a un mes válido, informar al usuario.
                                            echo "<h1>Nota $nota es  deficiente</h1>";
+
                                            break;
+
                                            case $nota==4:
+
                                            echo "<h1>Nota $nota es  insuficiente</h1>";
+
                                            break;
+
                                            case $nota==5:
+
                                            echo "<h1>Nota $nota es  suficiente</h1>";
+
                                            break;
+
                                            case $nota==6:
+
                                            echo "<h1>Nota $nota es  bien</h1>";
+
                                            break;
+
                                            case ($nota>6 and $nota<9):
+
                                            echo "<h1>Nota $nota es  notable</h1>";
+
                                            break;
+
                                            case ($nota>=9):
+
                                            echo "<h1>Nota $nota es  sobresalinte</h1>";
+
                                            break;
+
                                            }
+
                                            </source>
+
  
                                            ===Iteración while===
+
{{Plegable|hide|Posible Solución|
                                            *Como en todos los bucles debemos siempre tener encuenta
+
<source lang=php>
                                            #inicializar la variable de control
+
<?php
                                            #actualizarla correctamente dentro del bucle
+
$mes = rand(1, 15);
                                            #realizar de forma correcta la evaluación de condición (< o <=), (> o >=), ...
+
                                            {{MRM_Actividad|Title=Uso de while|
+
                                            *Mostrar la suma de los primeros 100 números naturales
+
                                            *Se quiere ver el número de iteración y la suma hasta ese momento (Es decir queremos ver cien líneas)
+
                                            *Cada iteración que aparezca en numeración ordinal en símbolo 1ª , 2ª, ...
+
  
                                            {{Plegable|hide|Posible solución|
+
switch ($mes) {
 +
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
 +
        echo "$mes es un mes de 31 días";
 +
        break;
 +
    case 4: case 6: case 9: case 11:
 +
        echo "$mes es un mes de 30 días";
 +
        break;
 +
    case 2:
 +
        echo "$mes es un mes de 28 o 29 días (dependiendo del año)";
 +
        break;
 +
    default:
 +
        echo "$mes no es un mes válido";
 +
}
 +
?>
 +
</source>
 +
}}
 +
}}
  
                                            <source lang=php>
+
===Selección con el operador match===
                                                <?php
+
*El operador match aparece en php en la versión 8
                                                $i = 0;
+
*Es una opción depurada y para casos concretos que puede sustituir de forma más eficiente y legigle a la estructura switch-case
                                                while ($i < 100) {
+
{{MRM_Puntos clave|Title=Operador match|
                                                    $suma+=$i;
+
*1.- Siempre retornará un valor
                                                    $i++;
+
*2.- Evaluamos una expresión, al igual que con switch-case
                                                    echo "iteracción  {$i}ª Suma $suma<br />";
+
*3.- En cada una de las ramas puedo establecer varias condiciones separadas por comas, intuyendo en ello una or lógica.
                                                }
+
*4.- Igual que en switch-case existe la rama default
                                                ?>
+
*5.- Como va a ser parte de una asignación, debe de terminar en ;
                                            </source>
+
*6.- Las comparaciones que hace son estrictas  a diferenica del switch-case que hace comparaciones no estrictas
                                            }}
+
}}
                                            }}
+
*A continuación podemos ver ejemplos
                                           
+
<source lang=php>
 +
$numero_mes = rand(1,15);
 +
$nombre_mes = match ($numero_mes){
 +
1=>"Enero",
 +
2=>"Febrero",
 +
.....
 +
default => "Mes incorrecto"
 +
};
 +
echo "El mes $numero_mes es $nombre_mes"
  
                                                <br />
+
</source>
 +
* Aquí vemos el uso de varios valores posibles en la comparación
 +
<source lang=php>
  
                                                ===Iteracción do-while===
+
```php
                                                *Este tipo de bucle donde seguro que al menos se ejecuta un iteracción
+
$numero_mes = rand(1,15);
                                                *Respecto al anterior nos ahorra una comparación.
+
$numero_dias=match($mes){ 
                                                {{MRM_Actividad|Title=Usando do-while|
+
    1,3,5,7,8,10,12 => 31, 
                                                *Modifica el ejercicio anterior usando un do-wile
+
    4,6,8,11 =>30, 
 +
    2 => 28 
 +
}; 
 +
echo "El mes $mes tiene $numero_dias días";
 +
</source>
  
                                                <source lang=php>
+
===Iteración while===
                                                </source>
+
*Como en todos los bucles debemos siempre tener encuenta
 +
#inicializar la variable de control
 +
#actualizarla correctamente dentro del bucle
 +
#realizar de forma correcta la evaluación de condición (< o <=), (> o >=), ...
 +
{{MRM_Actividad|Title=Uso de while|
 +
*Mostrar la suma de los primeros 100 números naturales
 +
*Se quiere ver el número de iteración y la suma hasta ese momento (Es decir queremos ver cien líneas)
 +
*Cada iteración que aparezca en numeración ordinal en símbolo 1ª , 2ª, ...
  
                                                }}
+
{{Plegable|hide|Posible solución|
  
                                               
+
<source lang=php>
                                                    <br />
+
    <?php
 +
    $i = 0;
 +
    while ($i < 100) {
 +
        $suma+=$i;
 +
        $i++;
 +
        echo "iteracción  {$i}ª Suma $suma<br />";
 +
    }
 +
    ?>
 +
</source>
 +
}}
 +
}}
  
                                                    ===Iteración for===
 
                                                    *Es un bucle de tipo contador
 
                                                    <source lang=php>
 
                                                    for (expresion_inicial; condicion;expresion_actualizar){
 
                                                    sentencias;
 
                                                    }
 
                                                    </source>
 
  
 +
{{MRM_Actividad|Title=Uso de while|
 +
*Generamos un número aleatorio entre 1 y 15.
 +
*Mostramos un mensaje con el número hasta que el número que salga sea el 13.
 +
*Podría ser que el número nos salga el primero en cuyo caso no habrá ningún mensaje
 +
*Mostramos cuantos números se han generado y la suma de los mismos
 +
}}
  
                                                   
 
                                                        ;Estructura for
 
                                                        *tiene tres partes
 
                                                        ;expresion_inicial:
 
                                                        :Se ejecuta una sola vez al comienzo del bucle. se usa para inicializar variables
 
                                                        ;condición
 
                                                        :Es una expresión booleana que se evalúa en cada interacción
 
                                                        :Si da un valor false, ya no se ejecuta ninguna vez
 
                                                        :Si no hay expresión se toma como true
 
                                                        :En este caso para que el bucle no sea infinito deberá llevar algún break (instrucción de terminación de bloque) en algún momento
 
                                                   
 
  
                                                   
+
}}
                                                        ;Estructura for: condición
+
                                                        <source lang=php>
+
                                                            <?php
+
                                                            for ($a=0; ;$a++){
+
                                                                echo "$a*$a=".$a*$a."<br>";
+
                                                                if ($a==10)
+
                                                                    break;
+
                                                            }
+
                                                            ?>
+
                                                        </source>
+
                                                   
+
  
                                                   
+
<br />
                                                        ;Estructura for: expresion_actualizar
+
 
                                                        :Esta expresión actualiza el valor de alguna/as variables
+
===Iteracción do-while===
                                                        :Se ejecuta en cada interactivo
+
*Este tipo de bucle donde seguro que al menos se ejecuta un iteracción
                                                        *El ejemplo anterior
+
*Respecto al anterior nos ahorra una comparación.
                                                        <source lang=php>
+
{{MRM_Actividad|Title=Usando do-while|
                                                            <?php
+
*Modifica el ejercicio anterior usando un do-wile
                                                            for ($a=0;$a<10 ;$a++){
+
*En este caso el número 13 también queremos que forme parte de la lista y se incluya tanto en la suma como en la contabilización,
                                                                echo "$a*$a=".$a*$a."<br>";
+
}}
                                                            }
+
{{MRM_Actividad|Title=Usando do-while|
                                                            ?>
+
;Programa para rellenar una bonoloto
                                                        </source>
+
*Generamos 5 valores aleatorios de 1 a 50 diferentes
 +
*Los motramos por pantalla
 +
{{Plegable|hide|Posiblesolucion|
 +
<source lang=php>
 +
 
 +
 
 +
$n1 = 72;
 +
$n2 = 15;
 +
$n3 = $n1&$n2;
 +
echo "<h1> $n1 or a nivel de bits $n2 es $n3</h1>";
 +
printf ("<h1> %b or %b es %b</h1>", $n1, $n2, $n3);
 +
 
 +
do{
 +
   
 +
}while (                      )
 +
$n1 = rand(1, 50);
 +
 
 +
do {
 +
    $n2 = rand(1, 50);
 +
} while ($n2 == $n1);
 +
 
 +
 
 +
do {
 +
    $n3 = rand(1, 50);
 +
} while (($n3 == $n1) OR ($n3 == $n2));
 +
 
 +
do {
 +
    $n4 = rand(1, 50);
 +
} while (($n4 == $n1) OR ($n4 == $n2)OR ($n4 == $n3));
 +
 
 +
do {
 +
    $n5 = rand(1, 50);
 +
} while ($n5 == $n1 || $n5 == $n2 || $n5 == $n3 || $n5 == $n4);
 +
 
 +
echo "<h1>Los números generados $n1-$n2-$n3-$n4-$n5</h1>";
 +
</source>
 +
 
 +
}}
 +
}}
 +
 
 +
{{MRM_Actividad|Title=Generar tabla ascii|
 +
;Programa para generar una tabla ascii con caracteres desde el 0 hasta el 127
 +
;Intentamos generar la tabla html
 +
<source lang=php>
 +
</source>
 +
 
 +
}}
 +
 
 +
{{MRM_Actividad|Title=Generar una password|
 +
;Programa para generar una passoword
 +
*Generamos una password con caracteres ascii (ver tabla anterior
 +
*La password debe de tener 7 caracteres
 +
*Los caracteres se puede repetir
 +
*Al menos 2 de ellos han de ser no alfanuméricos
 +
{{Plegable|hide|Posiblesolucion|
 +
<source lang=php>
 +
<?php
 +
//Parte fija
 +
 
 +
$password = "";
 +
for ($n = 0; $n < 2; $n++) {
 +
    $rango = rand(0,2);
 +
    $caracter = match ($rango) {
 +
        0 => rand(33, ord('0')),
 +
        1 => rand(ord('9'), ord('A')),
 +
        2 => rand(ord('Z'), 126),
 +
    };
 +
    $password .= chr($caracter);
 +
}
 +
 
 +
for ($n = 0; $n < 6; $n++) {
 +
    $caracter = rand(34, 126);
 +
    $password .= chr($caracter);
 +
}
 +
echo "<h1>$password</h1>";
 +
$password = str_shuffle($password);
 +
 
 +
echo "<h1>$password</h1>";
 +
//Parte común
 +
 
 +
 
 +
?>
 +
 
 +
</source>
 +
 
 +
}}
 +
}}
 +
 
 +
<source lang=php>
 +
</source>
 +
 
 +
}}
 +
<br />
 +
 
 +
===Iteración for===
 +
*Es un bucle de tipo contador
 +
<source lang=php>
 +
for (expresion_inicial; condicion;expresion_actualizar){
 +
sentencias;
 +
}
 +
</source>
 +
 
 +
 
 +
 
 +
;Estructura for
 +
*tiene tres partes
 +
;expresion_inicial:
 +
:Se ejecuta una sola vez al comienzo del bucle. se usa para inicializar variables
 +
;condición
 +
:Es una expresión booleana que se evalúa en cada interacción
 +
:Si da un valor false, ya no se ejecuta ninguna vez
 +
:Si no hay expresión se toma como true
 +
:En este caso para que el bucle no sea infinito deberá llevar algún break (instrucción de terminación de bloque) en algún momento
 +
;Incremento de la expresión inicial
 +
:Marca el paso o cómo se va modificando la variable de control en cada iteración
 +
 
 +
 
 +
;Estructura for: condición
 +
<source lang=php>
 +
    <?php
 +
    for ($a=0; ;$a++){
 +
        echo "$a*$a=".$a*$a."<br>";
 +
    }
 +
    ?>
 +
</source>
 +
*Es como si dentro del bucle establecemos la condición de terminación  usando la instrucción de terminación de bloque '''''break'''''
 +
*Observa el siguiente código <span id=r>forzado</span> y compáralo con el anterior (mira que la sección de condición está vacía)
 +
<source lang=php>
 +
    <?php
 +
    for ($a=0; ;$a++){
 +
        echo "$a*$a=".$a*$a."<br>";
 +
        if ($a==10)
 +
            break;
 +
    }
 +
    ?>
 +
</source>
 +
 
 +
 
 +
 
 +
;Estructura for: expresion_actualizar
 +
:Esta expresión actualiza el valor de alguna/as variables
 +
:Se ejecuta en cada interactivo
 +
*El ejemplo anterior
 +
<source lang=php>
 +
    <?php
 +
    for ($a=0;$a<10 ;$a++){
 +
        echo "$a*$a=".($a*$a)."<br>";
 +
    }
 +
    ?>
 +
</source>

Última revisión de 18:53 15 nov 2024

Estructuras de control

Icon objectives.jpg
Objetivo
Determinan el flujo de ejecución de un programa
  • Tenemos tres estructuras de control
  • Veremos cómo se implementan en PHP


Estructuras de control


  • Con este nombre, identificamos la estructura o forma con la que vamos a seguir el flujo de ejecución de un programa, es decir, especificar cuál es la siguiente intrucción que voy a ejecutar.
  • Tenemos tres estrucuturas de control

Son de tres tipos

  1. Secuenciales
  2. Selección
  3. Iteracción
  • Para construirlas necesitamos operadores que a continuación vamos a estudiar
  • A modo de resumen vamos a ver la siguiente tabla


Resumen de las estructurasd e control
Tipo de Estructura de control Sintáxis en php Ejemplo
Secuencial
{
 
sentencia_1;
sentencia_2;
....
}
$num = rand(-10,20)
echo "Se ha generado el numero $num";
Selectiva
if(expresion_booleana)
{
sentencia_1;
sentencia_2;
}
sentencia_3
$num = rand(-10,20);
if($num<0){
echo "El número tiene que ser mayor que 0, reasignamos el valor 1";
$num=1;
}
echo "El valor del número es $num";
Repetitiva
while (expresion_booleana){
sentencia_1;
sentencia_2;
}
sentencia_3
$num = 0;
$total=0;
while($num<100){
$total= $total+$num;
$num = $num+1;
}
echo "Los primeros 100 números suman $total";

Secuencial

  • Con esta estrucutra de control, lo que estamos especificando es que se ejecuta una instrucción detras de otra de forma seguida, por lo que el flujo de control es secuancial
Secuencial.png

Selección if

  • Sentencia que evalúa una expresión booleana y ejecuta o no en función de que dicha expresión sea true o false
if (expresion_booleana)
    Sentencia 1;

  • En caso de haber más de una setencia, obligatoriamente debemos de poner las llaves especificando el bloque de sentencias
 if  (expresion_booleana ){
    Sentencia_1;
    Sentencia_2;
 }


  • Podemos ver su lógica en la imagen siguiente
Estructura if.png


Sentencias de control
if  (expresion_booleana)
{
    bloque_de_sentencias_1;
}
    else
{
 bloque_de_sentencias_2;
}
  • Podemos ver su lógica en la imagen siguiente
Estructura if else.png


  • También existe la opción elseif donde aportaremos una condición que se ha de cumplir para que se ejecuten las sentencias que a continuación acompañan.
  • Se garantiza que solo se va a ejecutar un bloque de instrucciones.


Estructura de control
if (expresion_booleana_1)
{
bloque_sentencias_1;
}
elseif (expresion_booleana_2){
bloque_sentencias_2
}
elseif (expresion_booleana_3){
bloque_sentencias_3
}
elseif (expresion_booleana_4){
bloque_sentencias_4
}
else{
bloque_sentencia_5   ;
}
sentencia_6
  • Podemos ver su lógica en la imagen siguiente
Estructura if elseif.png


  • Alternativamente puede usarse esta sintaxis que es usada cuando se quiere intercalar condigo html fuera del php como veremos más adelante.
  • También se puede usar la sintaxis vista anteriormente, pero parece que esta quede más compacta.
if (condicion):
Sentencia 1;
endif;


Ahora lo vemos con código html
<?php if (true): ?>
 
    <h1>Esta frase seguro que aparece ahor</h1>
    <!--escribirmos código html -->
<?php else: ?>
    <h1>Aquí escribiré poco ya que no va a aparecer nada</h1>
    <!--escribimos código html -->
<?php endif ?>

Operador Ternario

  • El operador ternario es una forma más compacta de expresar una estructura if-else en una única línea, ideal cuando se desea evaluar una condición y devolver un valor en función del resultado.
  • Esta expresión retorna un valor según la condición especificada.
(expresión_booleana) ? valor_si_true : valor_si_false;
  • El valor que retorna es el resultado de la expresión que corresponda según el valor de la condición. Esta expresión es equivalente a:
if (expresión_booleana)
    valor_si_true;
else
    valor_si_false;
  • Usar el operador ternario ayuda a escribir el código de forma más compacta y clara, especialmente en expresiones sencillas.

Ejemplo



Icon activity.jpg
Actividad
Determinar si un número aleatorio es par o impar




  • Este operador ternario se utiliza mucho en programación, y conviene entenderlo y habituarse a su uso para escribir código más conciso y claro.

Selección con `switch`

  • El operador switch es un selector múltiple que permite evaluar el valor de una variable o expresión y ejecutar el bloque de código correspondiente al primer caso que coincida.
  • En PHP, la sentencia `case` puede albergar valores de cualquier tipo simple (números, cadenas, etc.), no está limitada a enteros como en otros lenguajes.
  • Esta estructura es útil cuando tenemos múltiples casos excluyentes y queremos evitar múltiples `if-else`.

Sintaxis

La sintaxis básica de un `switch` en PHP es:

switch ($valor) {
    case "valor1":
        // acciones
        break;
    case "valor2":
        // acciones
        break;
    case "valorn":
        // acciones
        break;
    default:
        // acciones si no hay coincidencia
}

Notas Importantes

  • El `switch` busca la primera coincidencia de `$valor` con los valores de los casos (`case`) y ejecuta todas las instrucciones posteriores hasta encontrar un `break`.
  • Si no se coloca un `break`, continuará ejecutando los casos siguientes, incluso si no coinciden.

Ejemplo Básico

Icon casestudy.gif
Ejemplo: Identificar un Nombre
  • Escribe un programa que evalúe si una variable `$nombre` es "María", "Pedro", o cualquier otro nombre.



Ejemplo con Rango de Valores

  • En algunos casos, queremos evaluar rangos de valores (por ejemplo, edades, calificaciones). En PHP, esto se logra usando expresiones booleanas dentro de los `case` y configurando el `switch` para evaluar `true`.



Icon casestudy.gif
Ejemplo: Nivel de Madurez
  • Generar una edad aleatoria entre 0 y 110 y clasificarla según el nivel de madurez:
 - 0–2: Bebé
 - 3–10: Niñez
 - 11–17: Adolescencia
 - 18–26: Juventud
 - 27–59: Adultez
 - 60–80: Experimentado
 - Más de 80: Disfrutando la vida



Casos Curiosos en PHP

En PHP, al comparar rangos o expresiones booleanas dentro de un `case`, se recomienda configurar el `switch` para evaluar `true`. Esto evita errores de interpretación con valores como `0`.

    • Ejemplo Problemático**:
<?php
$nota = 0;
 
switch ($nota) {
    case ($nota >= 0 && $nota <= 3):
        echo "Nota deficiente";
        break;
    case 4:
        echo "Nota insuficiente";
        break;
    case 5:
        echo "Nota suficiente";
        break;
    case ($nota > 6 && $nota < 9):
        echo "Nota notable";
        break;
    case ($nota >= 9):
        echo "Nota sobresaliente";
        break;
}
?>
  • Si `$nota = 0`, el primer caso no se ejecuta porque PHP convierte `0` a booleano `false`, lo que genera errores lógicos.
    • Solución Recomendada**:
<?php
$nota = rand(0, 10);
 
switch (true) {
    case ($nota >= 0 && $nota <= 3):
        echo "Nota deficiente";
        break;
    case $nota == 4:
        echo "Nota insuficiente";
        break;
    case $nota == 5:
        echo "Nota suficiente";
        break;
    case $nota == 6:
        echo "Nota bien";
        break;
    case ($nota >= 7 && $nota <= 8):
        echo "Nota notable";
        break;
    case ($nota >= 9):
        echo "Nota sobresaliente";
        break;
}
?>

Actividad Propuesta

  • Generar un número aleatorio para el mes (entre 1 y 12) y mostrar el número de días correspondientes. Si el número no corresponde a un mes válido, informar al usuario.

}}

Selección con el operador match

  • El operador match aparece en php en la versión 8
  • Es una opción depurada y para casos concretos que puede sustituir de forma más eficiente y legigle a la estructura switch-case


Icon key points.gif

Operador match

  • 1.- Siempre retornará un valor
  • 2.- Evaluamos una expresión, al igual que con switch-case
  • 3.- En cada una de las ramas puedo establecer varias condiciones separadas por comas, intuyendo en ello una or lógica.
  • 4.- Igual que en switch-case existe la rama default
  • 5.- Como va a ser parte de una asignación, debe de terminar en ;
  • 6.- Las comparaciones que hace son estrictas a diferenica del switch-case que hace comparaciones no estrictas


  • A continuación podemos ver ejemplos
$numero_mes = rand(1,15);
$nombre_mes = match ($numero_mes){
	1=>"Enero",
	2=>"Febrero",
	.....
	default => "Mes incorrecto"
};
echo "El mes $numero_mes es $nombre_mes"
  • Aquí vemos el uso de varios valores posibles en la comparación
```php
$numero_mes = rand(1,15);
$numero_dias=match($mes){  
    1,3,5,7,8,10,12 => 31,  
    4,6,8,11 =>30,  
    2 => 28  
};  
echo "El mes $mes tiene $numero_dias días";

Iteración while

  • Como en todos los bucles debemos siempre tener encuenta
  1. inicializar la variable de control
  2. actualizarla correctamente dentro del bucle
  3. realizar de forma correcta la evaluación de condición (< o <=), (> o >=), ...


Icon activity.jpg
Uso de while
  • Mostrar la suma de los primeros 100 números naturales
  • Se quiere ver el número de iteración y la suma hasta ese momento (Es decir queremos ver cien líneas)
  • Cada iteración que aparezca en numeración ordinal en símbolo 1ª , 2ª, ...






Icon activity.jpg
Uso de while
  • Generamos un número aleatorio entre 1 y 15.
  • Mostramos un mensaje con el número hasta que el número que salga sea el 13.
  • Podría ser que el número nos salga el primero en cuyo caso no habrá ningún mensaje
  • Mostramos cuantos números se han generado y la suma de los mismos




}}


Iteracción do-while

  • Este tipo de bucle donde seguro que al menos se ejecuta un iteracción
  • Respecto al anterior nos ahorra una comparación.


Icon activity.jpg
Usando do-while
  • Modifica el ejercicio anterior usando un do-wile
  • En este caso el número 13 también queremos que forme parte de la lista y se incluya tanto en la suma como en la contabilización,





Icon activity.jpg
Usando do-while
Programa para rellenar una bonoloto
  • Generamos 5 valores aleatorios de 1 a 50 diferentes
  • Los motramos por pantalla





Icon activity.jpg
Generar tabla ascii
Programa para generar una tabla ascii con caracteres desde el 0 hasta el 127
Intentamos generar la tabla html
 





Icon activity.jpg
Generar una password
Programa para generar una passoword
  • Generamos una password con caracteres ascii (ver tabla anterior
  • La password debe de tener 7 caracteres
  • Los caracteres se puede repetir
  • Al menos 2 de ellos han de ser no alfanuméricos




 

}}

Iteración for

  • Es un bucle de tipo contador
for (expresion_inicial; condicion;expresion_actualizar){
sentencias;
}


Estructura for
  • tiene tres partes
expresion_inicial
Se ejecuta una sola vez al comienzo del bucle. se usa para inicializar variables
condición
Es una expresión booleana que se evalúa en cada interacción
Si da un valor false, ya no se ejecuta ninguna vez
Si no hay expresión se toma como true
En este caso para que el bucle no sea infinito deberá llevar algún break (instrucción de terminación de bloque) en algún momento
Incremento de la expresión inicial
Marca el paso o cómo se va modificando la variable de control en cada iteración


Estructura for
condición
    <?php
    for ($a=0; ;$a++){
        echo "$a*$a=".$a*$a."<br>";
    }
    ?>
  • Es como si dentro del bucle establecemos la condición de terminación usando la instrucción de terminación de bloque break
  • Observa el siguiente código forzado y compáralo con el anterior (mira que la sección de condición está vacía)
    <?php
    for ($a=0; ;$a++){
        echo "$a*$a=".$a*$a."<br>";
        if ($a==10)
            break;
    }
    ?>


Estructura for
expresion_actualizar
Esta expresión actualiza el valor de alguna/as variables
Se ejecuta en cada interactivo
  • El ejemplo anterior
    <?php
    for ($a=0;$a<10 ;$a++){
        echo "$a*$a=".($a*$a)."<br>";
    }
    ?>