为何foreach循环内外$consolidated数组内容不一致?
问题原因与解决方案
这绝对是PHP里引用在foreach中最容易踩的坑之一!我来给你拆解清楚:
你第一个foreach循环用了&$item的引用方式来修改数组元素,这本身没问题,但循环结束后,$item这个变量并没有自动销毁——它依然是对$consolidated数组最后一个元素的引用。
等到你执行第二个foreach循环的时候,每次迭代都会把当前数组元素的值赋值给$item。但因为$item还是引用着最后一个元素,这就相当于:
- 第一次循环:把id=3的元素值,赋值给最后一个元素(此时最后一个元素变成id=3)
- 第二次循环:把id=15的元素值,赋值给最后一个元素(此时最后一个元素变成id=15)
- 第三次循环:把现在已经变成id=3的最后一个元素值,再赋值给自己(结果还是id=3)
所以最后你看到的结果就是原本id=16的元素被id=3的覆盖了。
修复方案
在第一个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)); // 这里纠正了你变量名的笔误:repeat_dates → repeatDate if($repeatDate <= $now){ $item['date'] = $repeatDate; break; } } }; }; // 关键步骤:销毁引用,避免后续操作污染原数组 unset($item); foreach ($consolidated as $item){ // 现在这里的$item是普通变量,不会再修改原数组 }; return $consolidated;
另外顺便提一句:你内层循环里的判断条件写了$repeat_dates <= $now,这里明显是变量名写错了,应该是$repeatDate,这个笔误也可能导致你的重复日期逻辑不生效,记得一起修正哦。
内容的提问来源于stack exchange,提问作者Xenology
相关产品推荐
相关产品推荐

