【问题标题】:Can PHP handle $_POSTing a multidimensional array with another field in the same form as a key?PHP 可以处理 $_POST 与另一个字段形式相同的多维数组作为键吗?
【发布时间】:2019-11-20 22:54:48
【问题描述】:

所以我有一个 html 表单,其中包含一个名为 "user_id[]" 的选择字段,以及另一个名为 "equipment_id[] 的相同表单中的选择字段。要点:

  • 每次我想添加另一组 "user_id[]""equipment_id[] 字段时,我都会使用 javascript 函数来复制它们。
  • "user_id[]" 字段中,我可以一次选择一个用户。
  • "equipment_id[]" 字段中,我可以从设备列表中选择多个选项。

当我 var dump 两个用户的示例条目时提交表单时,我目前得到的是:

["user_id"]=> array(2) { 
        [0]=> string(3) "178" 
        [1]=> string(3) "181" 
} 

["equipment_id"]=> array(5) { 
        [0]=> string(1) "3" // this element was selected with user_id 178
        [1]=> string(1) "4" // this element was selected with user_id 178 
        [2]=> string(1) "3" // this element was selected with user_id 181
        [3]=> string(1) "4" // this element was selected with user_id 181 
        [4]=> string(1) "5" // this element was selected with user_id 181 
}  

我想要达到的情况是 user_id 在其下具有每个选定的设备 ID,而不是在单个数组中,因此我可以将选定的设备与选定的用户关联起来。

我认为这可以通过使用"user_id[]" 字段作为"equipment_id[]" 字段的键来实现,这样如果提交表单,设备可能与用户相关联。

表单元素是:

<select name="user_id[]">
    <option value="" disabled selected>Choose a User</option>
    <option value="178">178</option>
    <option value="181">181</option>
</select>

<select name="equipment_id[]" multiple tabindex="10">
    <option value="" disabled selected>Choose Equipment</option>
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
    <option value="4">4</option>
    <option value="5">5</option>
</select>

所以问题:

  • 有没有办法使用user_id[] 字段作为equipment_id[] 字段的键,以便我可以使用user_id[] 提取为子数组?

  • 如果没有,是否有其他方法可以按用户对 equipment_id[] 字段选择进行编目并提取它们?

感谢任何指点! :0)

更新

我想我在 Stackexchange 的其他一些研究中偶然发现了这个问题的答案。

我的代码在下面

PHP/HTML

<?php
    var_dump($_POST);
?>
<html lang="en">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <button id="repeat">Add New Items</button>   
        <form class="work_entry_form" id="workform" action="#" method="POST">   
        <div class="group">
            <select name="user_id[0]" id="user_id">
                  <option value="" disabled selected>Choose user</option>
                  <option value="1">1</option>
                  <option value="2">2</option>
                  <option value="1">3</option>
                  <option value="2">4</option>
            </select>
            <select name="equipment_id[0][]" id="equipment_id" multiple tabindex="10">
                  <option value="" disabled selected>Choose Equipment</option>
                  <option value="1">1</option>
                  <option value="2">2</option>
                  <option value="3">3</option>
                  <option value="4">4</option>
                  <option value="5">5</option>
            </select>
        </div>
        <div class="extras" id="extras"></div>

        <input type="submit" id="submit">
        </form>    
    </body>
</html>

JavaScript(部分感谢 @superUntitled 来自 Increment multidimensional array when form fields are cloned 帖子)

 $(document).ready(function() {   
 $('#repeat').click(function(){
    var newgroup = $('.group:last').clone(true);
    newgroup.find(':input').each(function(){
        this.name = this.name.replace(/\[(\d+)\]/,function(str,p1){return '[' + (parseInt(p1,10)+1) + ']'});


    }).end().appendTo('#extras');
});
 });

这会导致 var 转储的(示例)细分如下:

array(2) { 
    ["user_id"]=> array(4) { 
        [0]=> string(1) "1" 
        [1]=> string(1) "2" 
        [2]=> string(1) "1" 
        [3]=> string(1) "2" 
    } 
    ["equipment_id"]=> array(4) { 
        [0]=> array(2) { 
            [0]=> string(1) "1" 
            [1]=> string(1) "2" 
        } 
        [1]=> array(3) { 
            [0]=> string(1) "2" 
            [1]=> string(1) "3" 
            [2]=> string(1) "4" 
        } 
        [2]=> array(2) { 
            [0]=> string(1) "4" 
            [1]=> string(1) "5" 
        } 
        [3]=> array(2) { 
            [0]=> string(1) "2" 
            [1]=> string(1) "4" 
        } 
    } 
}

我希望这对将来的某人有用!

JS Fiddle 如果有人想要的话:JSFiddle

【问题讨论】:

  • 您可以选择多个设备,当用户被选中时,这些设备会显示/隐藏。否则,您将不得不使用 Javascript 来构建您的作业并使用 AJAX 提交。
  • 这在 PHP 中是可能的,但是,我相信将需要 javascript 来发出请求。你要发送类似?user_id[178][]=3&amp;user_id[178][]=4

标签: php html arrays


【解决方案1】:

您可以使用此模式命名您的选择:

<select name="users[0][id]">

<select name="users[0][equipment_id]" multiple tabindex="10">

每次使用 JS 添加一组新的选择时,增加数字 id。

(如&lt;select name="users[1][id]"&gt;

然后你会有一个像这样的$_POST 数组:

['users' => [
    ['id' => 178, 'equipment_id' => [3, 4],
    ['id' => 181, 'equipment_id' => [3, 4, 5],
]

【讨论】:

  • 嗨@Don't Panic;我已经实现了这个,我得到的结果是:`array(1) { ["work"]=> array(1) { [0]=> array(4) { ["user_id"]=> string(3 ) "181" [0]=> array(1) { ["equipment_id"]=> string(1) "3" } [1]=> array(1) { ["equipment_id"]=> string(1) "4" } [2]=> array(1) { ["equipment_id"]=> string(1) "3" } } } } ` 它包括来自另一个 user_id 选择的设备项目:0)
  • 嗯,似乎在正确的轨道上,但并不完全在那里。你认为你可以给我一个链接到表单代码的小提琴吗?也许我能看出问题所在
  • 嗨@Don't Panic;感谢您迄今为止的反馈!我已将代码放入 [jsfiddle.net/1f5rydk7] 的 jsfiddle 中,但我在 [phpfiddle.org] 上执行了它
【解决方案2】:

这样的东西会有帮助吗?

<?php
var_dump($_POST);
?>

<form action="#" method="POST">
    <select name="user_id[]">
        <option value="" disabled selected>Choose a User</option>
        <option value="178">178</option>
        <option value="181">181</option>
    </select>
    <select name="equipment_id[178][]" multiple tabindex="10">
        <option value="" disabled selected>Choose Equipment</option>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
    </select>
    <select name="equipment_id[181][]" multiple tabindex="10">
        <option value="" disabled selected>Choose Equipment</option>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
    </select>
    <input type="submit" value="Submit" />
</form>

当您选择一些项目时,它会传递到服务器,例如:

[ 
    "user_id" => ["178"], 
    "equipment_id" => [
        178 => ["1", "2"],
        181 => ["2", "3"]
    ]
]

因此,通过对构建表单的 javascript 进行一些调整,这应该可以解决问题。

编辑:Don't panic's answer 更好,因为它不需要在渲染设备下拉列表之前选择用户。

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    相关资源
    最近更新 更多