在php项目开发中,经常用到foreach 进行对数组数据的循环,尤其是使用传&$item,这样的引用类使用;
在php里,
数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。
而在foreach的实现里,每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步。
当我们在第一个foreach中以引用的方式使用元素,循环结束之后,$v 其实是数组最后一个元素的引用。
由于foreach不销毁最后一个元素,所以当第一个循环结束时,我们有了一个隐藏的变量v,它是指向数组v,它是指向数组arr 最后一个元素的引用。
示例:
$arr = [ '0' => [ 'id' => 1, 'name' => '这是1', 'child' => [ '0' => [ 'child_id' => 100, 'child_name' => '这是 100 name', 'child' =>[ '0' => [ 'child_id' => 1001, 'child_name' => '这是 1001 name', ], '1' => [ 'child_id' => 1002, 'child_name' => '这是 1002 name', ], ], ], '1' => [ 'child_id' => 102, 'child_name' => '这是 102 name', ], '2' => [ 'child_id' => 103, 'child_name' => '这是 103 name', ], ], ], '1' => [ 'id' => 2, 'name' => '这是2', 'child' => [ '0' => [ 'child_id' => 201, 'child_name' => '这是 201 name', ], '1' => [ 'child_id' => 202, 'child_name' => '这是 202 name', ], '2' => [ 'child_id' => 203, 'child_name' => '这是 203 name', ], ], ], ]; $result = []; foreach($arr as $key=>$row){ foreach($row['child'] as $key=>&$item){ if(isset($item['child']) && !empty($item['child'])){ $result1 = []; foreach($item['child'] as $item){ $result1[] = $item; } } $item['child_name'] = $item['child_name'].'-'.rand(1,2); } $result[] = $row; } YxUtil::sys_debug($result);
有时候在处理一下比较大的数据遍历的时候,各种情况下可能会存在一些嵌套循环,foreach的key或value变量命名重复的情况,建议使用前unset掉,包括用完的变量也要及时释放掉。
近期就是遇到了这个问题,在一堆房源数据中,循环格式化数据,发生了房型错误归属的问题,终究是自己代码写的有问题,给自己挖了个坑。
建议还是养成良好的习惯,命名、书写及变量释放等。
此外推荐个替代函数array_map 及闭包的使用。