Invio di un array multidimensionale tramite POST con php


103

Ho un modulo php che ha un numero noto di colonne (es. Diametro superiore, diametro inferiore, tessuto, colore, quantità), ma ha un numero sconosciuto di righe, poiché gli utenti possono aggiungere righe di cui hanno bisogno.

Ho scoperto come prendere ciascuno dei campi (colonne) e inserirli in un proprio array.

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

Quindi quello che finisco con l'HTML è:

<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.

Quello che vorrei fare ora è prendere tutte le righe e le colonne, inserirle in un array multidimensionale e inviare via e-mail il contenuto di quello al client (preferibilmente in una tabella ben formattata). Non sono stato in grado di comprendere davvero come combinare tutti quegli input e selezioni in un bel array.

A questo punto, dovrò provare a utilizzare diversi array 1D, anche se ho l'idea che l'utilizzo di un singolo array 2D sarebbe una pratica migliore rispetto all'utilizzo di diversi array 1D.

Risposte:


149

Al momento dell'invio, otterrai un array come se fosse creato in questo modo:

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

Tuttavia, suggerirei di cambiare i nomi dei moduli in questo formato invece:

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

Usando questo formato, è molto più facile scorrere i valori.

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>';
}

Grazie! Avevo iniziato ad avvicinarmi a questo, anche se la colonna e le righe erano capovolte.
Fireflight

Che ne dici se stai clonando campi di testo e non hai alcun controllo nell'aggiunta di nomi per l'elenco, come name="diameters[0][top]cosa posso fare se ho più di un nome? come in alto, in basso, a sinistra ea destra? @DisgruntledGoat
JMASTER B

@JMASTERB Aggiunta tardiva ma dovresti aggiungere alcune elaborazioni con JS, cioè se sono in ordine, dovresti leggere il nome di input precedente dopo la clonazione e incrementare di 1 manualmente per ogni attributo del nome di input nel clone.
Daniel

16

puoi inviare tutti i parametri con tale denominazione:

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

poi in seguito fai qualcosa del genere:

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

0

Ho creato una funzione che gestisce array e singoli valori GET o POST

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;

}

Esempi:

$curr_topdiameter = subVal("topdiameter","",TRUE)[3];
$user_name = subVal("user_name","");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.