我读了很多与array_walk相关的帖子,但我不完全理解为什么我的代码不起作用。这是我的例子。
当我做var_dump
时,$new_array
是空的,如果我在每次迭代中写var_dump
,它会显示一些值,这意味着在每次迭代中将$new_array
视为一个新变量,我不知道为什么会这样。有人知道这段代码中发生了什么错误吗?
$exploded = explode(",", $moveArray[0]);
print_r($exploded);
$new_array = array();
array_walk($exploded,'walk', $new_array);
function walk($val, $key, &$new_array){
$att = explode('=',$val);
$new_array[$att[0]] = $att[1];
}
var_dump($new_array);
查看您的代码,我发现您的问题是解析以下内容:a=b,c=d,e=f
。事实上,由于您的问题是关于使用array_walk()
,因此有正确的用法:
$string = 'foo=bar,baz=bee,feo=fee';
$result = [];
array_walk(explode(',', $string), function($chunk) use (&$result)
{
$chunk = explode('=', $chunk);
$result[$chunk[0]]=$chunk[1];
});
-即使用匿名函数,该匿名函数通过引用接受上下文变量$result
来影响上下文变量。
但是,特别是您的案例,甚至不需要array_walk()
:
$string = 'foo=bar,baz=bee,feo=fee';
preg_match_all('/(.*?)'=(.*?)(,|$)/', $string, $matches);
$result = array_combine($matches[1], $matches[2]);
-甚至:
//will not work properly if values/names contain '&'
$string = 'foo=bar,baz=bee,feo=fee';
parse_str(str_replace(',', '&', $string), $result);
这样做。
$new_array = array();
array_walk($exploded,'walk');
function walk($val, $key){
global $new_array;
$att = explode('=',$val);
$new_array[$att[0]] = $att[1];
}