在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 及闭包的使用。
打赏
微信扫一扫,打赏作者吧~
如果本篇文章对您有帮助,欢迎向博主进行赞助,赞助时请写上您的用户名。
支付宝直接捐助帐号oracle_lee@qq.com 感谢支持!
喜欢 (0)or分享 (0)