フォーム入力配列をPHP配列に取得する方法


92

私はcontacts.phpに投稿される以下のようなフォームを持っており、ユーザーはjqueryで動的に追加できます。

<input type="text" name="name[]" />
<input type="text" name="email[]" />

<input type="text" name="name[]" />
<input type="text" name="email[]" />

<input type="text" name="name[]" />
<input type="text" name="email[]" />

以下のコードを使用してそれらをphpにエコー出力する場合

$name = $_POST['name'];
$email = $_POST['account'];

foreach( $name as $v ) {
print $v;
}

foreach( $email as $v ) {
print $v;
}

私はこのようなものを取得します:

name1name2name3email1email2email3

これらの配列を以下のコードのようなものにするにはどうすればよいですか

function show_Names($n, $m)
{
return("The name is $n and email is $m, thank you");
}

$a = array("name1", "name2", "name3");
$b = array("email1", "email2", "email3");

$c = array_map("show_Names", $a, $b);
print_r($c);

だから私の出力は次のようになります:

名前はname1で、メールはemail1です
。ありがとうございます名前はname2で、メールはemail2です
。ありがとうございます名前はname3で、メールはemail3です。ありがとうございます

助けやアドバイスをありがとう

回答:


146

それらはすでに配列にあります:$name配列です$email

したがって、両方の配列を攻撃するために少し処理を追加するだけです。

$name = $_POST['name'];
$email = $_POST['account'];

foreach( $name as $key => $n ) {
  print "The name is ".$n." and email is ".$email[$key].", thank you\n";
}

より多くの入力を処理するには、パターンを拡張するだけです。

$name = $_POST['name'];
$email = $_POST['account'];
$location = $_POST['location'];

foreach( $name as $key => $n ) {
  print "The name is ".$n.", email is ".$email[$key].
        ", and location is ".$location[$key].". Thank you\n";
}

ありがとう、location []のような別の入力を追加した場合、どうすればそれも追加できますか?
トム

1
基本的には、パターンを拡張するだけです。上記の私の編集を参照してください。追加の入力も$ _POSTから割り当てると配列になります(これらのフィールドで行ったように、htmlにその名前の入力が複数あると想定しています)。
ジェフリーブレイク

1
ジェフリー、配列の順序を信頼できるかしら。つまり、それは$emails[1]名前が付けられたユーザーに対応しています$name[1]か?私は過去にこれで問題に遭遇したと思いますが、私は間違っているかもしれません。ありがとう
idrarig

1
@bruciasse-サーバーがこのような入力配列を処理する方法は、Webサーバーによって異なります(OSが異なると、このような細かい詳細に関しては実装が異なります)。ただし、これらの手法を採用したすべてのプラットフォームは、それ自体(つまり、順序は毎回同じです)。ブラウザがリクエストをサーバーに渡す前にリクエスト変数の順序を混同する可能性がありますが、これはかなり珍しいことだと思います。直面する可能性のある最後の問題は、HTMLが奇妙な順序で混合され、CSSが調整されることです
Jeffrey Blake

...ポジショニング。あなたのページがそのようなものだった場合、配列の順序付けに関するいくつかの奇妙な問題が確かに見られます。
Jeffrey Blake

51

たとえば、フィールドに次のような名前を付ける

<input type="text" name="item[0][name]" />
<input type="text" name="item[0][email]" />

<input type="text" name="item[1][name]" />
<input type="text" name="item[1][email]" />

<input type="text" name="item[2][name]" />
<input type="text" name="item[2][email]" />

(JavaScriptを介して要素を追加するときにも可能です)

対応するphpスクリプトは次のようになります。

function show_Names($e)
{
  return "The name is $e[name] and email is $e[email], thank you";
}

$c = array_map("show_Names", $_POST['item']);
print_r($c);

4

今は少し遅れていますが、次のようなことができます。

function AddToArray ($post_information) {
    //Create the return array
    $return = array();
    //Iterate through the array passed
    foreach ($post_information as $key => $value) {
        //Append the key and value to the array, e.g.
            //$_POST['keys'] = "values" would be in the array as "keys"=>"values"
        $return[$key] = $value;
    }
    //Return the created array
    return $return;
}

テスト:

if (isset($_POST['submit'])) {
    var_dump(AddToArray($_POST));
}

これは私のために作りました:

array (size=1)
  0 => 
    array (size=5)
      'stake' => string '0' (length=1)
      'odds' => string '' (length=0)
      'ew' => string 'false' (length=5)
      'ew_deduction' => string '' (length=0)
      'submit' => string 'Open' (length=4)

2

フィールドセットの配列がある場合はどうなりますか?

<fieldset>
<input type="text" name="item[1]" />
<input type="text" name="item[2]" />
<input type="hidden" name="fset[]"/>
</fieldset>

<fieldset>
<input type="text" name="item[3]" />
<input type="text" name="item[4]" />
<input type="hidden" name="fset[]"/>
</fieldset>

フィールドセットの数を数えるために隠しフィールドを追加しました。ユーザーはフィールドを追加または削除してから保存できます。


2

私もこの問題に出くわしました。3つの入力がある場合:field []、field2 []、field3 []

これらの各フィールドには動的にアクセスできます。各フィールドは配列になるため、関連するフィールドはすべて同じ配列キーを共有します。たとえば、与えられた入力データ:

  • ボブ、bob @ bob.com、男性
  • マーク、mark @ mark.com、男性

ボブと彼のメールとセックスは同じ鍵を共有します。これを念頭に置いて、次のようなforループでデータにアクセスできます。

    for($x = 0; $x < count($first_name); $x++ )
    {
        echo $first_name[$x];
        echo $email[$x];
        echo $sex[$x];
        echo "<br/>";
    }

これもスケーリングします。新しいフィールドを追加する必要があるときはいつでも、対応する配列変数を追加するだけです。


0

ただし、VolkerKのソリューションは、電子メールとユーザー名のミスカップルを回避するのに最適です。したがって、次のようなPHPでHTMLコードを生成する必要があります。

<? foreach ($i = 0; $i < $total_data; $i++) : ?>
    <input type="text" name="name[<?= $i ?>]" />
    <input type="text" name="email[<?= $i ?>]" />
<? endforeach; ?>

$ total_dataをニーズに合わせて変更します。これを表示するには、次のようにします。

$output = array_map(create_function('$name, $email', 'return "The name is $name and email is $email, thank you.";'), $_POST['name'], $_POST['email']);
echo implode('<br>', $output);

データがPOSTメソッドを使用して送信されたと仮定します。


0

それにもかかわらず、以下のコードを次のように使用できます。

$a = array('name1','name2','name3');
$b = array('email1','email2','email3');

function f($a,$b){
    return "The name is $a and email is $b, thank you";
}

$c = array_map('f', $a, $b);

//echoing the result

foreach ($c as $val) {
    echo $val.'<br>';
}

0

これは簡単です。

foreach( $_POST['field'] as $num => $val ) {
      print ' '.$num.' -> '.$val.' ';
    }

-4

この方法を使用するとうまくいくはずです。

$name = $_POST['name'];
$email = $_POST['account'];
while($explore=each($email)) {
    echo $explore['key'];
    echo "-";
    echo $explore['value'];
    echo "<br/>";
}

回答を段階的に説明する
krisdestruction
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.