web-dev-qa-db-ja.com

PHPで処理するフォーム入力に連想配列を入れることはできますか?

_<input name="foo[]">_のようなことができることは知っていますが、_<input name="foo[bar]">_のようなことをして、PHP as _$_POST['foo']['bar']_として表示させることは可能ですか?

私が尋ねる理由は、フォーム要素の巨大なテーブル(複数の選択肢がある_<select>_を含む)を作成していて、そのスクリプトのためにデータをきれいに整理したいからです。に投稿しています。各列の入力要素のベース名は同じですが、配列キーとしての行識別子は異なります。それは理にかなっていますか?

EDIT:私はすでにこれを正確に試しましたが、どうやらDrupalは私がやろうとしていることを妨害しています。私は構文が間違っていると思っていました。Firebugは言います入力名はこのように構成されていますが、データは[foo] => array([bar] => data)ではなく_[foo[bar]] => data_として返されます。

編集2:私の本当の問題は、Drupalの_$form_state['values']_は_$_POST_と同じ配列階層を持つだろうという私の仮定でした。 Drupalがそれほど合理的で直感的であるとは、決して想定していませんでした。時間を無駄にして申し訳ありません。

18
DLH

これはDrupalでも非常に簡単に実行できます。覚えておく必要がある重要なことは、フォームの「#tree」パラメーターをTRUEに設定することです。簡単な例を示します。

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

ここで、MYMODULE_form_submit($ form、&$ form_state)でprint_r()$ form_state ['values']を実行すると、次のように表示されます。

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
)
5
Maciej Zgadzaj

以下のフォームを使用して学生のスコアを印刷するとします。

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

およびPHPスコアを出力するコード:

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

これにより、フィールドに入力した値が出力されます。

24

はい、できます。あなたもすることができますname="foor[bar][]"以降、さらにパディングします。

7
Neal