9 Stimmen

Wie man Daten als indiziertes Array von Arrays (ohne Angabe von Indizes) POSTet

Ich habe ein Problem mit der Buchung von Daten als Array von Array. Dies ist, wie ich möchte, dass meine Daten gepostet werden:

array(
['someName'] =>
array([0] =>
      array(['description'] =>890
            ['valore'] =>444)
      [1] =>
      array(['description'] =>98090
            ['value'] =>77)
) 

Ich weiß, dass ich das erreichen kann, wenn mein HTML so ist:

<input type='text' name="someName[0][value]">
<input type='text' name="someName[0][description]">
<input type='text' name="someName[1][value]">
<input type='text' name="someName[1][description]">

Mein Problem ist, dass die Eingabefelder auf Zeilen einer Tabelle sind und der Benutzer so viele Zeilen hinzufügen/entfernen kann, wie er möchte, also kann ich keinen festen Index haben (oder ich muss den Namen der Eingabefelder jedes Mal ändern, wenn eine Zeile hinzugefügt wird, da jedes Mal, wenn ich eine Zeile hinzufügen, ich die obere Zeile in der Tabelle klone)

Meine Frage ist also eine dieser beiden Dinge:

1) Gibt es eine Möglichkeit, Daten so zu posten, wie ich es möchte, ohne einen Index festzulegen?

2) Wenn nicht, wie kann ich das neue Eingabefeld dynamisch ändern, damit es einen aktualisierten Namen mit dem neuen Index erhält?

EDIT - ich hatte bereits versucht, mit name="someName[value][]" y name="someName[description][]" aber die Ausgabe ist nicht die gewünschte:

array(['terreniOneri'] =>
       array(['descrizione'] =>array([0] =>890
                                      [1] => 98090)
               ['valore'] =>array([0] =>444
                                  [1] =>677)
      ) 

Ich weiß, ich kann auf dieses Array in PHP iterieren, ich war nur wundern, wenn ich es vermeiden könnte.

7voto

Carlos Campderrós Punkte 21106

Machen Sie es so, wie Sie es in der Frage formuliert haben. Wenn der Benutzer eine Zeile entfernt, würden Ihre Formularelemente sein:

<form action="..." method="post" onsubmit="return reindexer(this);">
    <input type='text' name="someName[0][value]">
    <input type='text' name="someName[0][description]">
    <input type='text' name="someName[2][value]">
    <input type='text' name="someName[2][description]">
</form>

Aber es ist kein Problem, ein Array mit nicht zusammenhängenden numerischen Indizes in php zu durchlaufen: Verwenden Sie eine foreach Schleife.

<?php
if (count($_POST['somename']) > 0)
{
    foreach ($_POST['somename'] as $row)
    {
        echo "Value: ".$row['value']."<br />\n";
        echo "Description: ".$row['description']."<br />\n";
    }
}

Wenn Sie die Nummer jeder Zeile als fortlaufenden Index benötigen (im angegebenen Beispiel wäre Zeile 0 immer noch 0, aber Zeile 2 sollte 1 sein (da der Benutzer eine Zeile gelöscht hat), können Sie eine Variable verwenden, die als Zähler fungiert:

<?php
if (count($_POST['somename']) > 0)
{
    $i = 0;
    foreach ($_POST['somename'] as $row)
    {
        echo "Index $i<br />\n";
        echo "Value: ".$row['value']."<br />\n";
        echo "Description: ".$row['description']."<br />\n";
        $i++;
    }
}

Ich denke, dieser Ansatz hat mehr Sinn, dass die anderen Lösungen, wie auf diese Weise Sie ein Array von Elementen haben würde, wobei jedes Element einen Wert und eine Beschreibung, anstatt mit zwei separaten Arrays von Werten und Beschreibungen und haben die Werte für Ihr Element aus diesen zwei Arrays anstelle von einem zu erhalten.

edit: Ich habe den ersten Teil des Codes geändert, um die <form> Element. Dies wäre die zugehörige js-Funktion:

<script type="text/javascript">
function reindexer(frm)
{
    var counter = 0;
    var inputsPerRow = 2;
    for (var idx = 0; idx < frm.elements.length; idx++)
    {
        elm.name = elm.name.replace('%%INDEX%%', counter);
        if (idx % inputsPerRow == 1)
        {
            // only increment the counter (or row number) after you've processed all the
            // inputs from each row
            counter++;
        }
    }
}
</script>

4voto

Damien Punkte 664

Versuchen Sie es so:

<input type='text' name="someNameValue[]">
<input type='text' name="someNameDescription[]">

Wenn die Felder gepaart sind, können sie durch die Indizes verbunden werden. Wenn Sie also die 10. Zeile haben, werden someNameValue[9] und someNameDescription[9] ein Paar sein. Sie können sie zusammenführen.

EDIT: Sie müssen die Indizes nicht manuell erstellen, sie werden automatisch generiert.

<input type='text' name="someName[]">
<input type='text' name="someName[]">
<input type='text' name="someName[]">

y

<input type='text' name="someName[0]">
<input type='text' name="someName[1]">
<input type='text' name="someName[2]">

wird das gleiche Ergebnis in Ihrem Post-Array liefern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X