array_walk不会改变值


function values($id,$col)
{
$vals = [1=>['name'=>'Lifting Heavy Boxes']];
return $vals[$id][$col];
}
$complete = [1=>["id"=>"2","sid"=>"35","material_completed"=>"1","date"=>"2017-12-18"]];
$form = 'my_form';
array_walk($complete, function(&$d,$k) use($form) {
$k = values($k, 'name').' ['.date('m/d/y',strtotime($d['date'])).'] ('.$form.')';
echo 'in walk '.$k."n";
});
print_r($complete);

echo输出:

in walk Lifting Heavy Boxes [12/18/17] (my_form)

print_r输出:

Array
(
[1] => Array
(
[id] => 2
[sid] => 35
[material_completed] => 1
[date] => 2017-12-18
)
)

我还有另一个非常相似的阵列行走,做得很好。我能察觉到它们之间的唯一区别是,在起作用的那个中,值$d在通过遍历之前已经是一个字符串,而在不起作用的那个中,$d是一个数组,在遍历中转换为字符串(成功,但最终不成功(。

我错过了什么?

这是固定版本:

array_walk($complete, function(&$d,$k) use($form) {
$d = values($k, 'name').' ['.date('m/d/y',strtotime($d['date'])).'] ('.$form.')';
});

无论如何,这就是我试图做的。我没有试图更改密钥。我错误地认为要更改值,您必须将键设置为新值。

你不能在array_walk()的回调中更改数组的键:

只有array的值可能会被改变;它的结构不能被改变,即程序员不能添加、取消设置或重新排序元素。如果回调不遵守此要求,则此函数的行为是未定义的,并且不可预测。

在第一条评论中也提到了这一点:

array_walk不能用于更改数组中的键是毫无价值的。 该函数可以定义为 (&$value, $key(,但不能定义为 (&$value, &$key(。 即使 PHP 不抱怨/警告,它也不会修改密钥。

最新更新