首页 > 解决方案 > 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.')';
});

无论如何,这就是我想要做的。我不是换钥匙。我的错误印象是,要更改值,您必须将键设置为新值。

标签: phparray-walk

解决方案


您不能在以下回调中更改数组的键array_walk()

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

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

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


推荐阅读