PHP实现多数组按日期合并并生成带类型标记的自定义数组
多业务源数组按日期整合实现方案
核心实现逻辑
- 建立「源数据数组-对应来源类型标记」的映射关系,避免对3个独立数组重复编写遍历逻辑
- 逐次遍历每个源数组的所有记录,给每条记录动态追加对应的
type字段标记 - 对全量收集的记录按
date字段升序排序,实现同日期条目相邻归拢的效果 - 若需要自定义同日期下不同来源条目的排列顺序,可在排序回调中增加类型权重判断
可直接运行的处理代码
注意:你提供的预期结构中存在一处笔误:打款数据的原字段为
amount,示例预期里误写为od_amount,实现过程中会保留原数据的字段名,不会随意重命名字段导致数据错位。
基础实现代码:
// 源数据与对应类型的映射配置 $sourceMap = [ 'transactions' => $transactions, 'overdrafts' => $overdrafts, 'payout' => $payouts ]; $merged_arr = []; // 遍历所有源数据 foreach ($sourceMap as $typeName => $dataList) { foreach ($dataList as $record) { // 追加来源类型标记,不修改原数组结构 $record['type'] = $typeName; $merged_arr[] = $record; } } // 按日期升序排序,实现同日期条目归拢 usort($merged_arr, function($a, $b) { return strtotime($a['date']) <=> strtotime($b['date']); });
如果需要自定义同日期下的条目排序规则(比如同日期下交易类记录排在最前,其次是透支类,最后是打款类),可以替换排序逻辑为:
usort($merged_arr, function($a, $b) { // 先按日期排序 $dateSort = strtotime($a['date']) <=> strtotime($b['date']); if ($dateSort !== 0) { return $dateSort; } // 同日期下按类型权重排序 $typePriority = [ 'transactions' => 1, 'overdrafts' => 2, 'payout' => 3 ]; return $typePriority[$a['type']] <=> $typePriority[$b['type']]; });
常见踩坑说明
- 不要使用按日期建键的聚合方式:本次需求要求每条记录独立保留、携带来源标记,而非将同日期的不同业务字段合并为单条结构
- 不要省略排序步骤:默认收集的临时数组会按照「交易全量条目→透支全量条目→打款全量条目」的源数组顺序排列,无法实现同日期归拢的效果
- 遍历追加字段时不要直接引用原数组:避免修改原业务数据的结构,防止影响其他业务逻辑的调用
内容的提问来源于stack exchange,提问作者Wells
相关产品推荐
相关产品推荐

