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.

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

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

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","");
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.