> Manuales > Manual de PHP

Un ejemplo avanzado de envío de datos por formulario con PHP, donde se genera un array de campos input y se recibe mediante un recorrido foreach. Ideal cuando tienes formularios con un número de elementos dinámico que puede variar.

Enviar un array de elementos input en un formulario con PHP

En el artículo anterior hemos visto las bases de trabajo con PHP para el envío de datos mediante formularios. El ejercicio nos sirvió para conocer cómo se envían y reciben datos de campos de formulario comunes, lo que es suficiente para la mayoría de los formularios. Sin embargo, a veces el problema es algo más complejo.

Imagina que necesitas recibir múltiples valores de un formulario, por ejemplo, un número indeterminado de nombres de usuarios, el un número indeterminado de nombres de productos. Entonces no nos vale con un simple campo <input>, necesitamos colocar varios elementos, un número indeterminado de veces, y luego recibirlos todos desde PHP.

El problema además se complica cuando no sabemos el número de elementos que nos pueden llegar. Pueden ser 3 usuarios o algunas veces 4… o 10. En estos casos, lo mejor que podemos hacer es enviar un array de valores y recibirlos mediante un bucle.

Es un bonito ejercicio que vamos a resolver ahora y que nos servirá para practicar con PHP, haciendo un ejemplo un poco más avanzado que los vistos hasta ahora en el Manual de PHP. Veremos cómo trabajar con formularios dinámicos y hacer recorridos a arrays de campos de formulario.

Crear un array de campos input

Para comenzar vamos a analizar el problema de manera sencilla, viendo algo que nos permite el HTML a la hora de crear formularios.

Cuando tenemos varios campos de formulario que queremos unir para que se envíen como un array, simplemente necesitamos colocarle unos corchetes al final del nombre (atributo "name") del campo.

<form action="#" method="POST">
    <input type="text" name="campo[]" value="campo1">
    <input type="text" name="campo[]" value="campo2">
    <input type="text" name="campo[]" value="campo3">
    <input type="submit" value="enviar">
</form>

Este formulario, en el que no hemos usado PHP todavía, tiene 3 campos input de "type text". Observarás que los tres campos se llaman igual, lo que en principio podría parecer un error. Sin embargo, todos ellos tienen unos corchetes al final del "name", por lo que el navegador los enviará como si fuera un array, en vez de enviarlos como campos "sueltos".

Recibir un array de campos input con PHP

Cuando estamos recibiendo un formulario de estas características, en el que pasamos un array de campos, a la hora de recibirlo lo que vamos a obtener es un array en vez de una cantidad de valores sueltos.

Por ello, para obtener y trabajar con todos los valores del array, tendremos que realizar un recorrido con un bucle. Podría ser algo como esto:

foreach($_POST['campo'] as $campo) {
    echo "<p>Valor recibido: $campo</p>";
}

Como puedes comprobar, $_POST['campo'] contendrá un array donde en cada una de sus casillas encontramos cada uno de los valores de los campos input que se han asociado usando el mismo "name" pero añadiendo los corchetes.

Con esta sencilla práctica podríamos recibir tres valores de input como hemos visto aquí o miles de ellos. El bucle simplemente los recorrerá todos.

Ejemplo de formulario dinámico con valores enviados como arrays

Ahora vamos a ver un ejemplo más completo en una página PHP que creará un formulario dinámicamente. Este formulario tendrá un número indeterminado de campos input, sin que sepamos a ciencia cierta cuántos serán. Por tanto, es ideal enviarlos como un array.

Dentro de la complejidad de este ejemplo iremos a algo simple. Se trata de recibir un número indeterminado de nombres de frutas y luego mostrarlas en la página.

Este ejemplo tendrá 3 pasos:

De hecho, en este ejemplo de página PHP vamos a tener dos formularios. En el primero preguntaremos cuántos elementos queremos mostrar en el formulario y en el segundo ya construiremos el formulario con todos los elementos que sean necesarios.

El ejemplo se puede complicar un poco con tanto formulario que se procesa en la misma página, pero te invitamos a que lo estudies y si tienes cualquier pregunta nos la realices en la sección de FAQs.

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Recibir varios nombres de frutas</title>
</head>
<body>
    <h1>Recibir varios nombres de frutas</h1>
    <?php
    if(!$_POST) {
    ?>
        <form action="<?= $_SERVER['PHP_SELF']; ?>" method="POST">
            <label for="num">¿Cuántas frutas deseas indicar?</label>
            <input type="text" name="num" />
            <input type="submit" name="submit" value="Enviar" />
        </form>
    <?php
    } elseif(isset($_POST['num'])) {
    ?>
        <form action="<?=$_SERVER['PHP_SELF']?>" method="POST">
        <?php
            $num = $_POST['num'];
            for($i = 0; $i < $num; $i++) {
                ?>
                <input type="text" name="fruta[]" value="" />
                <br>
                <?php
            }
        ?>
            <input type="submit" value="Enviar" />
        </form>
    <?php
    } else {
        foreach($_POST['fruta'] as $fruta) {
            echo "<p>Fruta recibida: $fruta</p>";
        }
    }
    ?>
</body>
</html>

Ten en cuenta que este ejemplo está construido como prueba de concepto. Si estás trabajando con PHP y quieres que tu código sea más fácilmente mantenible no debrerías mezclar los bloques de HTML con los bloques de código PHP para el control del flujo. Todo esto que tiene que ver con la organización del código lo explicamos en artículos más avanzados en el futuro.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual