Enviar una matriz multidimensional a través de POST con php

103

Tengo un formulario php que tiene un número conocido de columnas (por ejemplo, diámetro superior, diámetro inferior, tela, color, cantidad), pero tiene un número desconocido de filas, ya que los usuarios pueden agregar filas cuando lo necesiten.

Descubrí cómo tomar cada uno de los campos (columnas) y colocarlos en una matriz propia.

<input name="topdiameter['+current+']" type="text" id="topdiameter'+current+'" size="5" />
<input name="bottomdiameter['+current+']" type="text" id="bottomdiameter'+current+'" size="5" />

Entonces, lo que termino con el HTML es:

<tr>
  <td><input name="topdiameter[0]" type="text" id="topdiameter0" size="5" /></td>
  <td><input name="bottomdiameter[0]" type="text" id="bottomdiameter0" size="5" /></td>
</tr>
<tr>
  <td><input name="topdiameter[1]" type="text" id="topdiameter1" size="5" /></td>
  <td><input name="bottomdiameter[1]" type="text" id="bottomdiameter1" size="5" /></td>
</tr>

...and so on.

Lo que me gustaría hacer ahora es tomar todas las filas y columnas, ponerlas en una matriz multidimensional y enviar por correo electrónico el contenido al cliente (preferiblemente en una tabla con un formato agradable). No he podido comprender realmente cómo combinar todas esas entradas y selecciones en una buena matriz.

En este punto, tendré que intentar usar varios arreglos 1D, aunque tengo la idea de que usar un solo arreglo 2D sería una mejor práctica que usar varios arreglos 1D.

Fireflight
fuente

Respuestas:

149

Al enviarlo, obtendría una matriz como si se creara así:

$_POST['topdiameter'] = array( 'first value', 'second value' );
$_POST['bottomdiameter'] = array( 'first value', 'second value' );

Sin embargo, sugeriría cambiar los nombres de sus formularios a este formato en su lugar:

name="diameters[0][top]"
name="diameters[0][bottom]"
name="diameters[1][top]"
name="diameters[1][bottom]"
...

Con ese formato, es mucho más fácil recorrer los valores.

if ( isset( $_POST['diameters'] ) )
{
    echo '<table>';
    foreach ( $_POST['diameters'] as $diam )
    {
        // here you have access to $diam['top'] and $diam['bottom']
        echo '<tr>';
        echo '  <td>', $diam['top'], '</td>';
        echo '  <td>', $diam['bottom'], '</td>';
        echo '</tr>';
    }
    echo '</table>';
}
Cabra descontento
fuente
¡Gracias! Empecé a acercarme a esto, aunque tenía la columna y las filas invertidas.
Fireflight
¿Qué tal si está clonando campos de texto y no tiene control para agregar nombres a la lista, por ejemplo, name="diameters[0][top]qué puedo hacer si tengo más de un nombre? como arriba, abajo, izquierda y derecha? @DisgruntledGoat
JMASTER B
@JMASTERB Adición tardía, pero tendría que agregar algo de procesamiento con JS, es decir, si están en orden, leería el nombre de entrada anterior después de la clonación e incrementaría en 1 manualmente para cada atributo de nombre de entrada en el clon.
Daniel
16

podría enviar todos los parámetros con ese nombre:

params[0][topdiameter]
params[0][bottomdiameter]
params[1][topdiameter]
params[1][bottomdiameter]

luego más tarde haces algo como esto:

foreach ($_REQUEST['params'] as $item) {
    echo $item['topdiameter'];
    echo $item['bottomdiameter'];
}
Laimoncijus
fuente
0

Hice una función que maneja matrices, así como valores GET o POST individuales

function subVal($varName, $default=NULL,$isArray=FALSE ){ // $isArray toggles between (multi)array or single mode

    $retVal = "";
    $retArray = array();

    if($isArray) {
        if(isset($_POST[$varName])) {
            foreach ( $_POST[$varName] as $var ) {  // multidimensional POST array elements
                $retArray[]=$var;
            }
        }
        $retVal=$retArray;
    }

    elseif (isset($_POST[$varName]) )  {  // simple POST array element
        $retVal = $_POST[$varName];
    }

    else {
        if (isset($_GET[$varName]) ) {
            $retVal = $_GET[$varName];    // simple GET array element
        }
        else {
            $retVal = $default;
        }
    }

    return $retVal;

}

Ejemplos:

$curr_topdiameter = subVal("topdiameter","",TRUE)[3];
$user_name = subVal("user_name","");
Szél Lajos
fuente