如何合并两个PDO(FETCH_ASSOC)数组并按共享date列排序?
当然可以!这里有两种实用方案,你可以根据自己的场景来选:
方案一:数据库层面合并查询(推荐)
如果数据量比较大,或者想让数据库帮你处理排序(毕竟数据库在这方面的优化更到位),可以直接把两个查询用UNION ALL合并,然后统一按date排序。
需要注意的是,UNION ALL要求两个查询返回的字段数量一致,字段类型尽量匹配。对于两个表中不同的字段,可以用NULL来填充占位。
举个例子:
假设第一个查询是从table1取col1、col2和date,第二个查询是从table2取col3、col4和date,那合并后的SQL可以这么写:
SELECT col1, col2, NULL AS col3, NULL AS col4, date FROM table1 UNION ALL SELECT NULL AS col1, NULL AS col2, col3, col4, date FROM table2 ORDER BY date ASC; -- 降序就改成 DESC
然后用PDO执行这个合并后的SQL语句,一次获取结果集就直接是按date排好序的了:
$combinedStmt = $pdo->prepare($sql); $combinedStmt->execute(); $sortedResults = $combinedStmt->fetchAll(PDO::FETCH_ASSOC);
方案二:PHP层面合并数组后排序
如果两个查询的逻辑比较复杂,不方便在数据库层面合并,那可以先分别获取两个结果集,合并后再用PHP的排序函数处理。
步骤大概是这样:
// 先获取两个查询的结果数组 $result1 = $stmt1->fetchAll(PDO::FETCH_ASSOC); $result2 = $stmt2->fetchAll(PDO::FETCH_ASSOC); // 合并两个数组 $combinedArray = array_merge($result1, $result2); // 用usort自定义排序规则,按date升序排列 usort($combinedArray, function($itemA, $itemB) { // 把timestamp字符串转成时间戳,再比较 $timeA = strtotime($itemA['date']); $timeB = strtotime($itemB['date']); // 升序:return $timeA - $timeB; // 降序:return $timeB - $timeA; return $timeA - $timeB; }); // 现在$combinedArray就是按date排好序的结果了
这种方法适合数据量不大的场景,如果数据太多,PHP排序的效率会不如数据库层面处理。
内容的提问来源于stack exchange,提问作者user9644796
相关产品推荐
相关产品推荐

