我有以下代码,它接受一组数据并根据它们是否相关来合并项目。我的代码的第一部分运行并返回我期望的内容。但是在这个过程之后,我需要根据其中项目的日期对数组进行排序。当我再次引用这个数组并尝试对项目进行排序时,数组中的项目会根据是否在同一个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。我很难理解为什么会发生这种情况。
答案 0 :(得分:0)
这可能是参考问题。如果你取消设置$ item,它将清除对原始$ item的引用,尽管开始了一个新的foreach,它仍然存在。
unset($item);
答案 1 :(得分:0)
所以当你使用&amp; $ item时,它将被引用到每个迭代的数组$ consolidated,但是在完成第一个循环之后,$ item仍指向数组中的最后一项。
然后当第二个for循环开始时,$ item将设置为$ consolidated中的第一个项目,但仍有一个参考点指向上一个循环中的$ item。由于它是一个引用,它将更改为现在指向$ item的任何内容。因此,最后一项的值现在更改为第一项。这种情况发生在每次foreach迭代中。
我会避免以这种方式使用引用,但如果必须这样做。
请使用循环之间的未设置删除引用
unset($item);