我试图找出如何处理可能重复的数组键。是的,我知道重复的数组键是不可能的,但暂时没有我。
我有一个带有选择下拉列表的表格,可以选择多个选项(超过1个)。我正在使用jQuery.serialize()
序列化提交表单。
多选元素的序列化字符串如下所示:
select=1&select=2&select=3 // assumming I selected first 3 options.
现在在PHP方面,我有以下代码来处理数据库中的“保存”部分。
$form_data = $_POST['form_items'];
$form_data = str_replace('&','####',$form_data);
$form_data = urldecode($form_data);
$arr = array();
foreach (explode('####', $form_data) as $part) {
list($key, $value) = explode('=', $part, 2);
$arr[$key] = $value;
}
好的,这一切都适用于其余的表单元素,但是当涉及到select元素时,它只选择最后选择的键/值对。所以我的阵列现在看起来像这样:
Array ( [select_element] => 3)
我需要的是它看起来像:
Array ( [select_element] => '1,2,3')
所以我想我要问的是基于我的代码,如何检查密钥是否已经存在以及是否存在,请附加到$value
。
答案 0 :(得分:5)
如果您可以修改客户端代码,我宁愿将select
的名称更改为select[]
,这样它将在服务器脚本中解析为数组。
答案 1 :(得分:1)
您不能拥有多个具有相同名称的密钥......它们是唯一的密钥。它正在做的是设置select = 1
,然后设置select = 2
,然后设置select = 3
,最终得到的最终值为3。
如果要在选择菜单中允许多个选项,则应更改元素的名称,以便将该数据作为数组提交,而不是多个字符串:
<select name="select[]" multiple="multiple">
应该导致这样的事情:
select[]=1&select[]=2&select[]=3
当PHP请求该数据时,它已经是一个数组:
$data = $_POST['select'];
echo print_r($data); // Array(1, 2, 3)
答案 2 :(得分:1)
PHP有自己的方法将数组编码为application/x-www-form-urlencoded
字符串。
PHP x-www-form-urlencoded
的反序列化由parse_str()
实现。您可以将PHP视为在每个填充$_GET
和$_POST
的请求开始时运行这些行:
parse_str($_SERVER['QUERY_STRING'], $_GET);
parse_str(file_get_contents('php://input'), $_POST);
parse_str()
使用类似于其数组语法的方括号语法从查询字符串创建数组:
select[]=1&select[]=2&select[]=3&select[key]=value
这将被反序列化为:
array('1', '2', '3', 'key'=>'value');
如果没有这些方括号,PHP将使用给定键的最后一个值。请参阅this question in the PHP and HTML FAQ。
如果你无法控制POSTed界面(例如,你无法在表单中添加方括号),你可以自己从php://input
解析POST输入,并重写或忽略{ {1}}变量。
(但请注意,$_POST
输入没有解决方法,因为multipart/form-data
在这些情况下不可用。php://input
和{{ 1}}将完全无可挽回地失去。)
答案 3 :(得分:1)
好的,我可以使用以下代码解决此问题:
if (array_key_exists($key, $arr)) {
$arr[$key] = $arr[$key].','.$value;
} else {
$arr[$key] = $value;
}
所以现在循环看起来像这样:
foreach (explode('####', $form_data) as $part) {
list($key, $value) = explode('=', $part, 2);
if (array_key_exists($key, $arr)) {
$arr[$key] = $arr[$key].','.$value;
} else {
$arr[$key] = $value;
}
}
这将基本上将值组合在一起,用逗号分隔,然后可以将其展开到数组中。
答案 4 :(得分:0)
您应该更改客户端代码以发送扩充值:array.join(",");
并在PHP端使用它。因为当您的数据到达您的脚本时,其他值已经丢失。
答案 5 :(得分:-1)
这应该为您提供所需的解决方案
$form_data = str_replace('&','####',$form_data);
$form_data = urldecode($form_data);
$arr = array();
foreach (explode('####', $form_data) as $part) {
list($key, $value) = explode('=', $part, 2);
if (isset($arr[ $key ])) {
$arr[$key] = ','.$value;
} else {
$arr[$key] = $value;
}
}