2011-06-24 8 views
14

So che posso fare cose come <input name="foo[]">, ma è possibile fare cose come <input name="foo[bar]"> e farlo apparire in PHP come $_POST['foo']['bar']?Posso inserire array associativi negli input dei form per essere elaborati in PHP?

Il motivo che mi chiedo è perché sto facendo un enorme tavolo di elementi del modulo (tra cui <select> con selezioni multiple), e voglio che i miei dati organizzati in modo pulito per lo script che sto postando. Voglio che gli elementi di input in ogni colonna abbiano lo stesso nome base, ma un identificatore di riga diverso come una chiave di array. Ha senso?

EDIT: Ho provato esattamente questo già, ma a quanto pare Drupal interferisce con quello che sto cercando di fare. Pensavo di sbagliare la mia sintassi. Firebug mi dice che i miei nomi di input sono costruiti esattamente come questo, ma i miei dati tornano come [foo[bar]] => data anziché [foo] => array([bar] => data).

EDIT 2: Sembra che il mio vero problema era la mia ipotesi che $form_state['values'] in Drupal avrebbe la stessa gerarchia array come $_POST. Non avrei mai dovuto presumere che Drupal sarebbe stato così ragionevole e intuitivo. Mi scuso per aver sprecato il tuo tempo. Puoi andare in giro per la tua azienda.

+2

Questo è ciò che il manuale dice http://www.php.net/manual/en/faq.html.php#faq.html.arrays – mario

+0

possibile duplicato di [Posting array from form] (http: // stackoverflow. it/questions/6152436/posting-array-from-form) – mario

+0

Dispari, ho provato a fare esattamente questo e non ha funzionato. Credo che sia solo perché sto usando Drupal:/Ho pensato che non stavo facendo la sintassi PHP giusta. Ora non sono sicuro di dover rivedere questa domanda o scrivere una nuova domanda specifica per Drupal. – DLH

risposta

5

Puoi farlo anche in Drupal, abbastanza facilmente. La cosa importante da ricordare è impostare il parametro '#tree' su TRUE. Per darvi un esempio veloce:

function MYMODULE_form() { 
    $form = array('#tree' => TRUE); 
    $form['group_1']['field_1'] = array(
    '#type' => 'textfield', 
    '#title' => 'Field 1', 
); 
    $form['group_1']['field_2'] = array(
    '#type' => 'textfield', 
    '#title' => 'Field 2', 
); 
    $form['group_2']['field_3'] = array(
    '#type' => 'textfield', 
    '#title' => 'Field 3', 
); 
    $form['submit'] = array(
    '#type' => 'submit', 
    '#value' => 'Submit', 
); 
    return $form; 
} 

Ora, se si print_r() $ form_state [ 'valori'] a MYMODULE_form_submit (sotto forma $, & $ form_state), si vedrà qualcosa di simile:

Array 
(
    [group_1] => Array 
     (
      [field_1] => abcd 
      [field_2] => efgh 
     ) 

    [group_2] => Array 
     (
      [field_3] => ijkl 
     ) 

    [op] => Submit 
    [submit] => Submit 
    [form_build_id] => form-7a870f2ffdd231d9f76f033f4863648d 
    [form_id] => test_form 
) 
+0

Oooohh non sapevo di # tree tree. Ho i miei array di moduli strutturati in modo simile a questo, ma non sapevo che ci fosse una bandiera in più lì che mi mancava. Grazie! – DLH

6

Sì, è possibile. puoi persino fare name="foor[bar][]" e via per ancora più padding.

21

diciamo che vogliamo stampare i punteggi degli studenti utilizzando il modulo sottostante:

<form action="" method="POST"> 
    <input name="student['john']"> 
    <input name="student['kofi']"> 
    <input name="student['kwame']"> 
    <input type="submit" name="submit"> 
</form> 

e PHP codice per stampare i loro punteggi:

if(isset($_POST['submit'])) 
{ 
    echo $_POST['student']['john'] . '<br />'; 
    echo $_POST['student']['kofi'] . '<br />'; 
    echo $_POST['student']['kwame'] . '<br />'; 
} 

Questo stamperà i valori immessi nel campo.

+1

Ho provato la tua soluzione, ma mi chiedo perché devo usarlo in questo modo: '$ _POST ['studente'] ['\' john \ '']'? Lo uso anche in questo modo: '' – Julian

Problemi correlati