2018年04月6日网站服务器迁移完成……

php foreach($data as &$item)踩的坑

php 苏 demo 208℃

在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 及闭包的使用。

打赏

转载请注明:苏demo的博客 » php foreach($data as &$item)踩的坑

   如果本篇文章对您有帮助,欢迎向博主进行赞助,赞助时请写上您的用户名。
支付宝直接捐助帐号oracle_lee@qq.com 感谢支持!
喜欢 (0)or分享 (0)