php - 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 没有抱怨/警告,它也不会修改密钥。
推荐阅读
- salesforce - azure 数据工厂 - 销售人员查找
- typescript - 使用 TypeScript 和 Emotion 设计 Reach UI
- javascript - 返回最短和最长单词的长度之差(使用 for 循环)
- ios - SwiftUI:使用 MFMailComposeViewController 发送电子邮件
- java - 当用户打开某个应用程序时启动我的应用程序 - Android
- php - symfony 5中服务容器中的异常
- firebase - Flutter 确实会弹出一个带有 Firestore 流的屏幕,重新读取文档
- javascript - 如何在基于函数的组件中使用 this.executeAction("someAction")?
- python - 计算一个字符串出现在字符串的相反位置的次数
- python - 值错误 X 有 24 个特征,但 DecisionTreeClassifier 期望 19 个特征作为输入