我最近遇到了一个实际问题。我正在处理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),
)
键数组中缺少第二个值。
答案 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"]
答案 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
,但是从技术上讲,该字符串不正确。
如果数据发送正确,则不必对数据进行后期处理,因为该问题未包括在内,所以我只能对数据的来源进行假设。
如果您手动创建它,我建议在表单元素上使用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);
上面的代码不是特定于您的键的,这是一件好事。并且应该处理以这种方式格式化的任何字符串。如果您确实混合了正确的数组格式,则可以添加一些额外的代码来处理该格式,但是处理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]]]
如您所见,它可以很快地失控,因此,如果您不需要它,我会犹豫地尝试解决这个问题。
干杯!