为什么我的数组内容在foreach循环中不同?

时间:2018-01-20 03:14:19

标签: php arrays

我有以下代码,它接受一组数据并根据它们是否相关来合并项目。我的代码的第一部分运行并返回我期望的内容。但是在这个过程之后,我需要根据其中项目的日期对数组进行排序。当我再次引用这个数组并尝试对项目进行排序时,数组中的项目会根据是否在同一个foreach循环内而改变。

    foreach ($consolidated as &$item) {
        $date = date('Y-m-d', strtotime($item['date']));
        $now = date('Y-m-d');

        if($date < $now && count($item['repeat_dates'])){
            foreach ($item['repeat_dates'] as $date) {
                $repeatDate = date('Y-m-d', strtotime($date));
                if($repeat_dates <= $now){
                    $item['date'] = $repeatDate;
                    break;
                }
            }
        };
    };

    //die(json_encode($consolidated));

    foreach ($consolidated as $item){
        //die(json_encode($consolidated )); 
    };
    return $consolidated;

如果我取消注释第一个骰子,代码将返回以下内容。

[  
   {  
      id:"3",
      date:"2018-01-25",
      last_date:"2018-01-25",
      start:"16:45:41",
      end:"17:05:41",
      timezone:"Mountain Standard Time",
      created_date:"2017-12-23 23:57:11",
      enabled:"1",
      repeat_dates:[...]
   },
   {  
      id:"15",
      date:"2018-02-07",
      last_date:"2018-04-11",
      start:"12:25:18",
      end:"12:30:18",
      timezone:"Mountain Standard Time",
      created_date:"2018-01-19 19:50:51",
      enabled:"1",
      repeat_dates:[...]
   },
   {  
      id:"16",
      date:"2018-01-24",
      last_date:"2018-02-02",
      start:"17:30:24",
      end:"17:55:24",
      timezone:"Mountain Standard Time",
      created_date:"2018-01-19 19:54:48",
      enabled:"1",
      repeat_dates:[...]
   }
]

但是,如果我取消注释第二个模具,我会收到以下响应:

[  
   {  
      id:"3",
      date:"2018-01-25",
      last_date:"2018-01-25",
      start:"16:45:41",
      end:"17:05:41",
      timezone:"Mountain Standard Time",
      created_date:"2017-12-23 23:57:11",
      enabled:"1",
      repeat_dates:[...]
   },
   {  
      id:"15",
      date:"2018-02-07",
      last_date:"2018-04-11",
      start:"12:25:18",
      end:"12:30:18",
      timezone:"Mountain Standard Time",
      created_date:"2018-01-19 19:50:51",
      enabled:"1",
      repeat_dates:[...]
   },
   {  
      id:"3",
      date:"2018-01-25",
      last_date:"2018-01-25",
      start:"16:45:41",
      end:"17:05:41",
      timezone:"Mountain Standard Time",
      created_date:"2017-12-23 23:57:11",
      enabled:"1",
      repeat_dates:[...]
   }
]

您会注意到ID在此处重复两次,而不是拥有所有三个ID。我很难理解为什么会发生这种情况。

2 个答案:

答案 0 :(得分:0)

这可能是参考问题。如果你取消设置$ item,它将清除对原始$ item的引用,尽管开始了一个新的foreach,它仍然存在。

unset($item); 

答案 1 :(得分:0)

所以当你使用&amp; $ item时,它将被引用到每个迭代的数组$ consolidated,但是在完成第一个循环之后,$ item仍指向数组中的最后一项。

然后当第二个for循环开始时,$ item将设置为$ consolidated中的第一个项目,但仍有一个参考点指向上一个循环中的$ item。由于它是一个引用,它将更改为现在指向$ item的任何内容。因此,最后一项的值现在更改为第一项。这种情况发生在每次foreach迭代中。

我会避免以这种方式使用引用,但如果必须这样做。

请使用循环之间的未设置删除引用

  unset($item);