背景
已知一个map如下:
$array = array(
"key1" => 1,
"key2" => 2,
"key3" => 3
)
想要做的操作:
- 修改map中每个value的值
- 将map中的所有value放入一个数组中返回
实现方式
方案
主要通过foreach和&(引用)实现,如下:
// step1
foreach($array as $key => &$value) {
$value += 1;
}
// step2
$result = array();
foreach($array as $key => $value) {
array_push($result, $value);
}
print_r($result);
如果不用&(引用),无法修改数组的值。
如果想在遍历数组的过程中修改数组的元素,可以在foreach中对$value使用引用。此时被引用的元素$value指向当前数组元素的内存地址,即共享一段内存地址。因此修改$value的值会同时改变$array[$key]的值。
结果
$result = array(2, 3, 3)
分析
当使用&(引用)后,$value值的修改会同时修改原数组中的值,在step1过后,$value始终指向数组最后一个元素,在step2遍历过程中,一直在修改数组最后一个元素的值。过程如下:
解决方案:
- 在step1后,unset($value),移除$value的指向
- 在step2中遍历时,同样使用&引用
结论
- foreach遍历时,使用的是数组的副本;若加上&引用,访问的才是原始数组;
- 在foreach中使用的变量,在之后的代码中并不会自动释放;