如何通过爆炸来制作键值并将匹配的键值排列为一个键?

时间:2019-05-16 22:08:16

标签: php arrays explode

我最近遇到了一个实际问题。我正在处理ajax表单提交,并且存在一些复选框。我需要所有与键值对名称相同的复选框。假设有4个具有name属性{ {1}},所以我想要类似=checks

所以我正在获取我的ajax $ _POST代码,例如:$arr['checks'] = array(value1, value2, ...)

我正在使用下面的代码制作一个数组

name=alex&checks=code1&checks=code2&checks=code3

我在这里想要public function smdv_process_option_data(){ $dataarray = array(); $newdataarray = array(); $new = array(); $notices = array(); $data = $_POST['options']; // data received by ajax $dataarray = explode('&', $data); foreach ($dataarray as $key => $value) { $i = explode('=', $value); $j = 1; if(array_key_exists($i[0], $newdataarray)){ if( !is_array($newdataarray[$i[0]]) ){ array_push($new, $newdataarray[$i[0]]); }else{ array_push($new, $i[1]); } $newdataarray[$i[0]] = $new; }else{ $newdataarray[$i[0]] = $i[1]; } } die($newdataarray); } 如下

$newdataarray

但是无论如何,我array( 'name' => 'alex', 'checks => array(code1, code2, code3), ) 键数组中缺少第二个值。

2 个答案:

答案 0 :(得分:2)

如我所见,您只需要执行两种爆炸语法即可。
首先是要获取名称,在这里我先在&上爆炸,然后在name=上爆炸,以便在字符串中隔离名称。
如果您省略带有array_slice的第一项,则检查会激增&checks=

$str = 'name=alex&checks=code1&checks=code2&checks=code3';

$name = explode("name=", explode("&", $str)[0])[1];
// alex

$checks = array_slice(explode("&checks=", $str), 1);
// ["code1","code2","code3"]

https://3v4l.org/TefuG

答案 1 :(得分:2)

  

所以我正在获取我的ajax $ _POST代码,例如:name = alex&checks = code1&checks = code2&checks = code3

改为使用parse_str

https://php.net/manual/en/function.parse-str.php

  

parse_str(字符串$ encoded_string [,array&$ result]):空   解析encode_string,就好像它是通过URL传递的查询字符串一样,并在当前范围(或提供结果的数组)中设​​置变量。

$s = 'name=alex&checks=code1&checks=code2&checks=code3';

parse_str($s, $r);

print_r($r);

输出

Array
(
    [name] => alex
    [checks] => code3
)

您可能会认为这是错误的,因为只有一个checks,但是从技术上讲,该字符串不正确。

Sandbox

如果数据发送正确,则不必对数据进行后期处理,因为该问题未包括在内,所以我只能对数据的来源进行假设。

如果您手动创建它,我建议在表单元素上使用serialize()来获取AJAX数据。后处理只是一个创可贴,并且会增加不必要的复杂性。

如果它来自控件外部的源,则必须手动解析(尝试)。

例如,编码字符串的正确方法是:

name=alex&checks[]=code1&checks[]=code2&checks[]=code3

与上述代码一起使用时,会产生所需的输出。

Array
(
    [name] => alex
    [checks] => Array
        (
            [0] => code1
            [1] => code2
            [2] => code3
        )

)

这里的问题还是它的构造方式...

更新

我有义务为您提供手动解析选项:

$str = 'name=alex&checks=code1&checks=code2&checks=code3';
$res = [];

foreach(explode('&',$str) as $value){
    //PHP 7 array destructuring 
    [$key,$value] = explode('=', $value);

    //PHP 5.x list()
    //list($key,$value) = explode('=', $value);

    if(isset($res[$key])){
        if(!is_array($res[$key])){
            //convert single values to array
            $res[$key] = [$res[$key]];
        }
        $res[$key][] = $value;
    }else{
        $res[$key] = $value;
    }
}

print_r($res);

Sandbox

上面的代码不是特定于您的键的,这是一件好事。并且应该处理以这种方式格式化的任何字符串。如果您确实混合了正确的数组格式,则可以添加一些额外的代码来处理该格式,但是处理key[]的所有用例可能会是一个挑战,例如,这些都是有效的:

 key[]=value&key[]=value //[key => [value,value]]
 key[foo]=value&key[bar]=value //[key => [foo=>value,bar=>value]]
 key[foo][]=value&key[bar][]=value&key[bar][]=value //[key => [foo=>[value]], [bar=>[value,value]]]

如您所见,它可以很快地失控,因此,如果您不需要它,我会犹豫地尝试解决这个问题。

干杯!