2013-11-25 11 views
36

bekam ich eine Form wie diesesHTML/PHP - Form - Eingang als Array

<form> 
<input type="text" class="form-control" placeholder="Titel" name="levels[level]"> 
<input type="text" class="form-control" placeholder="Titel" name="levels[build_time]"> 

<input type="text" class="form-control" placeholder="Titel" name="levels[level]"> 
<input type="text" class="form-control" placeholder="Titel" name="levels[build_time]"> 

</form> 

Was ich möchte, wie $ _POST Ausgang haben, ist ein Array wie

Array ( 
    [1] => Array ([level] => 1 [build_time] => 123) 
    [2] => Array ([level] => 2 [build_time] => 456) 
) 

Ich weiß, ich könnte etwas wie name = "levels [1] [build_time]" usw. tun, aber da diese Elemente dynamisch hinzugefügt werden, wäre es schwierig, einen Index hinzuzufügen. Gibt es einen anderen Weg?

EDIT:

Wie vorgeschlagen, änderte ich meine Form. Ich habe jetzt auch meinen ganzen HTML-Code eingefügt, weil ich denke, dass mir hier etwas fehlt. Mein HTML jetzt:

<div class="form-group"> 
    <label class="col-md-2">Name(z.B. 1)</label> 
    <div class="col-md-10"> 
    <input type="text" class="form-control" placeholder="Titel" name="levels[][level]"> 
    </div> 

    <label class="col-md-2">Bauzeit(In Sekunden)</label> 
    <div class="col-md-10"> 
    <input type="text" class="form-control" placeholder="Titel" name="levels[][build_time]"> 
    </div> 
</div> 

<div class="form-group"> 
    <label class="col-md-2">Name(z.B. 1)</label> 
    <div class="col-md-10"> 
    <input type="text" class="form-control" placeholder="Titel" name="levels[][level]"> 
    </div> 

    <label class="col-md-2">Bauzeit(In Sekunden)</label> 
    <div class="col-md-10"> 
    <input type="text" class="form-control" placeholder="Titel" name="levels[][build_time]"> 
    </div> 
</div> 

Der Ausgang ich jetzt bekommen ist:

[levels] => Array ( 
    [0] => Array ([level] => 1) 
    [1] => Array ([build_time] => 234) 
    [2] => Array ([level] => 2) 
    [3] => Array ([build_time] => 456) 
) 

Edit 2:

Wie in deine Bearbeitung vorgeschlagen, herausgegeben ich meine Form und bewegt die eckigen Klammern zu das Ende des Namens. Die Ausgabe, die ich jetzt bekomme, ist:

Ich denke, das würde irgendwie funktionieren, aber es sieht immer noch kompliziert aus. Kein besserer Weg?

Antwort

57

Fügen Sie einfach [] jenen Namen wie

<input type="text" class="form-control" placeholder="Titel" name="levels[level][]"> 
<input type="text" class="form-control" placeholder="Titel" name="levels[build_time][]"> 

diese Vorlage nehmen und dann können Sie diese hinzufügen, auch mit einer Schleife.

Dann können Sie diese dynamisch hinzufügen so viel wie Sie wollen, ohne einen Index zur Verfügung zu stellen. PHP wird sie genau wie Ihr erwartetes Beispielszenario aufnehmen.

bearbeiten

Sorry, ich Klammern an der falschen Stelle hatte, die jeden neuen Wert als neues Array-Element machen würde. Verwenden Sie den aktualisierten Code jetzt und Sie erhalten die folgende Array-Struktur

levels > level (Array) 
levels > build_time (Array) 

Der gleiche Index auf beiden Sub-Arrays wird Ihnen Ihr Paar geben. Zum Beispiel

echo $levels["level"][5]; 
echo $levels["build_time"][5]; 
+0

Bitte siehe meine Bearbeitung, was mache ich falsch? –

+0

Hoppla Entschuldigung, ich hatte meine eckigen Klammern an der falschen Stelle. Bitte verschiebe sie zum Ende des Namens wie meine neue Bearbeitung. –

+0

Ich sehe, du hast deinen Post wieder bearbeitet :) Ich habe jetzt die gleiche Struktur, aber es ist immer noch nicht das, was ich ursprünglich wollte. Das ist der beste Weg, es zu tun? –

4

zusätzlich: für diejenigen, die einen leeren POST Variable haben, tue dies nicht nutzen:

name="[levels][level][]" 

eher dieses verwenden (wie es bereits hier in diesem Beispiel):

name="levels[level][]" 
15

Wenn für Sie indizieren ok ist das Array Sie können dies tun:

<form> 
    <input type="text" class="form-control" placeholder="Titel" name="levels[0][level]"> 
    <input type="text" class="form-control" placeholder="Titel" name="levels[0][build_time]"> 

    <input type="text" class="form-control" placeholder="Titel" name="levels[1][level]"> 
    <input type="text" class="form-control" placeholder="Titel" name="levels[1][build_time]"> 

    <input type="text" class="form-control" placeholder="Titel" name="levels[2][level]"> 
    <input type="text" class="form-control" placeholder="Titel" name="levels[2][build_time]"> 
</form> 

...

[levels] => Array ( 
    [0] => Array ( 
    [level] => 1 
    [build_time] => 2 
) 
    [1] => Array ( 
    [level] => 234 
    [build_time] => 456 
) 
    [2] => Array ( 
    [level] => 111 
    [build_time] => 222 
) 
) 

Aber wenn Sie ein Paar Eingänge entfernen (dynamisch, nehme ich an) aus der Mitte des Formulars dann werden Sie Löcher in Ihrem Array erhalten, wenn Sie die Eingabenamen aktualisieren ...: das erreichen

5

HTML: Verwenden Sie Namen wie

<input name="levels[level][]"> 
<input name="levels[build_time][]"> 

PHP:

$array = filter_input_array(INPUT_POST); 
$newArray = array(); 
foreach (array_keys($array) as $fieldKey) { 
    foreach ($array[$fieldKey] as $key=>$value) { 
     $newArray[$key][$fieldKey] = $value; 
    } 
} 

$ newArray wird, wie Sie halten Daten wollen

Array ( 
    [0] => Array ([level] => 1 [build_time] => 123) 
    [1] => Array ([level] => 2 [build_time] => 456) 
) 
+2

Ich bin nicht sicher, warum das downvoted wurde, aber das war genau das, was ich brauchte. – Dediqated