使用foreach修改PHP数组元素失败,如何解决数组值未更新问题?
PHP foreach遍历数组无法更新元素的问题解决
问题描述
使用foreach操作多维数组时,修改遍历得到的$item后,原数组并未发生变化,代码如下:
$arr = [ 'step_1' => [ 'method' => 'getLastRealisesData', 'description' => 'Get last realises data', 'error' => null, 'done' => 0 ], 'step_2' => [ 'method' => 'downloadFile', 'description' => 'Download file', 'error' => null, 'done' => 0 ] ]; foreach($arr as $item){ $result = 0; if($result == 0){ $item['done'] = 0; $item['error'] = 'Error message'; break; } $result = 1; }
原因分析
PHP的foreach默认采用值传递机制,遍历过程中$item是原数组元素的一个副本,你修改的只是这个副本,并不会同步到原数组中,所以执行完循环后原数组没有变化。
解决方案
不需要使用对象,有两种简单的方式可以实现修改原数组:
1. 使用引用传递
在foreach的$item前加上&符号,让$item成为原数组元素的引用,这样修改$item就会直接作用于原数组:
foreach($arr as &$item){ // 给$item添加引用符号& $result = 0; if($result == 0){ $item['done'] = 0; $item['error'] = 'Error message'; break; } $result = 1; } unset($item); // 遍历结束后建议销毁引用,避免后续变量污染
2. 通过键名操作原数组
遍历的时候同时获取元素的键名,直接通过键名访问原数组并修改:
foreach($arr as $key => $item){ $result = 0; if($result == 0){ $arr[$key]['done'] = 0; $arr[$key]['error'] = 'Error message'; break; } $result = 1; }
这两种方法都能直接修改原数组,根据自己的习惯选择即可。
内容的提问来源于stack exchange,提问作者dream fly
相关产品推荐
相关产品推荐

