You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:23:46