PHP遍历多维数组按id_property分组取date_max最大值的实现问题
问题原因
你写的代码有几个核心逻辑错误:
- 双重循环逻辑冗余,同一个
id_property的条目会两两比对多次,只要当前条目比任意一个同id条目date_max大就会插入结果数组,最终同一个id_property会返回多条重复数据,不符合「每个id仅返回一条最大日期条目」的要求 - 插入结果时你把三个字段组装成了索引数组,没有保留原数组的关联键结构,和需求返回原条目的逻辑不符
- 没有做最大值覆盖判断,无法保证最终保留的是同id下
date_max最大的条目
正确实现
只需要单次遍历即可完成需求,时间复杂度O(n),比双重循环的O(n²)效率更高:
$temp = []; foreach ($sql as $item) { $id = $item['id_property']; // 临时数组中不存在该id,或者当前条目日期比已存的更大,就覆盖写入 if (!isset($temp[$id]) || $item['date_max'] > $temp[$id]['date_max']) { $temp[$id] = $item; } } // 取出临时数组的值就是最终结果,重置为0、1、2开头的索引数组 $result = array_values($temp);
注:你使用的Y-m-d格式日期字符串可以直接用大小于号比对,字典序和时间顺序完全一致,不需要额外转时间戳。
内容的提问来源于stack exchange,提问作者test_user
相关产品推荐
相关产品推荐

