PHP如何处理可能重复的数组键?

时间:2012-01-14 20:02:10

标签: php arrays

我试图找出如何处理可能重复的数组键。是的,我知道重复的数组键是不可能的,但暂时没有我。

我有一个带有选择下拉列表的表格,可以选择多个选项(超过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

6 个答案:

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