2013-11-25 23 views
36

ho ottenuto una forma come questaHtml/PHP - Form - ingresso come array di

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

Quello che mi piacerebbe avere da $ _POST uscita è un array come

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

So potrebbe fare qualcosa come name = "levels [1] [build_time]" e così via ma dato che questi elementi vengono aggiunti dinamicamente, sarebbe difficile aggiungere un indice. C'è un altro modo?

EDIT:

Come suggerito, ho cambiato la mia forma. Ho anche incluso il mio intero HTML ora, perché penso che mi manchi qualcosa qui. La mia HTML ora:

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

L'uscita ottengo ora è:

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

Edit 2:

Come suggerito nella tua modifica, ho modificato la mia forma e si è trasferito le parentesi quadre per la fine del nome. L'output che ottengo ora è:

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

Immagino che potrebbe funzionare un po 'ma sembra ancora complicato. Non c'è modo migliore?

risposta

57

Basta aggiungere [] a quei nomi come

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

Prendete il modello ed è possibile aggiungere quelli, anche utilizzando un ciclo.

Quindi è possibile aggiungere quelli dinamicamente tanto quanto si desidera, senza dover fornire un indice. PHP li raccoglierà proprio come il tuo esempio di scenario previsto.

Modifica

dispiace ho avuto parentesi graffe nel posto sbagliato, il che renderebbe ogni nuovo valore come nuovo elemento di un array. Usa il codice aggiornato ora e questo ti darà la seguente struttura di array

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

Lo stesso indice su entrambi i sotto-array ti darà la tua coppia. Ad esempio

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

Si prega di vedere la mia modifica, cosa sto facendo di sbagliato? –

+0

Ooops mi dispiace di avere le parentesi quadre nel posto sbagliato. Per favore spostali alla fine del nome come la mia nuova modifica. –

+0

Vedo che hai modificato il tuo post di nuovo :) Ho ottenuto la stessa struttura ora ma non è ancora quello che volevo inizialmente. Questo è il modo migliore per farlo? –

4

inoltre: per chi ha una variabile POST vuoto, non usare questo:

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

piuttosto utilizzare questo (come è già qui in questo esempio):

name="levels[level][]" 
15

Se è ok per voi per indicizzare la matrice si può fare questo:

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

...per raggiungere questo:

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

Ma se si rimuove una coppia di ingressi (in modo dinamico, suppongo) a partire dalla metà del modulo allora avrai buchi nella propria matrice, a meno che non si aggiornano i nomi di ingresso ...

5

HTML: Utilizzare nomi come

<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 terrà dati come voi voglio

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

Non sono sicuro del motivo per cui questo è stato downvoted, ma questo era esattamente ciò di cui avevo bisogno. – Dediqated

Problemi correlati