Senden eines mehrdimensionalen Arrays über POST mit PHP

102

Ich habe ein PHP-Formular mit einer bekannten Anzahl von Spalten (z. B. oberer Durchmesser, unterer Durchmesser, Stoff, Farbe, Menge), aber einer unbekannten Anzahl von Zeilen, da Benutzer Zeilen nach Bedarf hinzufügen können.

Ich habe herausgefunden, wie man jedes der Felder (Spalten) in ein eigenes Array einfügt.

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

Was ich also im HTML habe, ist:

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

Was ich jetzt tun möchte, ist, alle Zeilen und Spalten in ein mehrdimensionales Array zu packen und den Inhalt davon per E-Mail an den Client zu senden (vorzugsweise in einer schön formatierten Tabelle). Ich habe nicht wirklich verstanden, wie man all diese Eingaben und Auswahlen zu einem schönen Array kombiniert.

An diesem Punkt muss ich versuchen, mehrere 1D-Arrays zu verwenden, obwohl ich die Idee habe, dass die Verwendung eines einzelnen 2D-Arrays eine bessere Vorgehensweise wäre als die Verwendung mehrerer 1D-Arrays.

Feuer Flug
quelle

Antworten:

148

Beim Senden erhalten Sie ein Array, als ob es wie folgt erstellt worden wäre:

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

Ich würde jedoch vorschlagen, stattdessen Ihre Formularnamen in dieses Format zu ändern:

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

Mit diesem Format ist es viel einfacher, die Werte zu durchlaufen.

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>';
}
DisgruntledGoat
quelle
Vielen Dank! Ich hatte angefangen, mich dem anzunähern, obwohl ich die Spalte und die Zeilen umgedreht hatte.
Fireflight
Wie wäre es, wenn Sie Textfelder klonen und keine Kontrolle über das Hinzufügen von Namen für Listen haben, z. B. name="diameters[0][top]was kann ich tun, wenn ich mehr als einen Namen habe? wie oben, unten, links und rechts? @ DisgruntledGoat
JMASTER B
@JMASTERB Spätes Hinzufügen, aber Sie müssten eine Verarbeitung mit JS hinzufügen, dh wenn diese in Ordnung sind, würden Sie den vorherigen Eingabenamen nach dem Klonen lesen und für jedes Eingabenamenattribut im Klon manuell um 1 erhöhen.
Daniel
16

Sie könnten alle Parameter mit einer solchen Benennung einreichen:

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

dann machst du später so etwas:

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

Ich habe eine Funktion erstellt, die sowohl Arrays als auch einzelne GET- oder POST-Werte verarbeitet

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;

}

Beispiele:

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