如何基于track_name与transaction_type匹配二维数组并补充默认值行
问题需求
需要处理两个PHP二维数组:
$saved_royalties:包含所有track_name与transaction_type的组合标识$matching_royalty_rows:可能缺少部分上述组合
要求对比两个数组后,为$matching_royalty_rows补充缺失的组合行,缺失行的gross_total字段设为0。原代码仅按索引匹配,无法处理同一track_name对应不同transaction_type的场景,需要正确实现方案。
示例输入
// $saved_royalties 全量组合示例 $saved_royalties = [ ['track_name' => 'Song A', 'transaction_type' => 'stream'], ['track_name' => 'Song A', 'transaction_type' => 'download'], ['track_name' => 'Song B', 'transaction_type' => 'stream'], ['track_name' => 'Song B', 'transaction_type' => 'download'], ]; // $matching_royalty_rows 缺失部分组合的示例 $matching_royalty_rows = [ ['track_name' => 'Song A', 'transaction_type' => 'stream', 'gross_total' => 10.5], ['track_name' => 'Song B', 'transaction_type' => 'download', 'gross_total' => 20.0], ];
错误输出(原索引匹配逻辑的结果)
// 仅按索引匹配会错误补充无关组合,无法区分同track_name下的不同transaction_type [ ['track_name' => 'Song A', 'transaction_type' => 'stream', 'gross_total' => 10.5], ['track_name' => 'Song B', 'transaction_type' => 'download', 'gross_total' => 20.0], ['track_name' => 'Song A', 'transaction_type' => 'stream', 'gross_total' => 0], ['track_name' => 'Song B', 'transaction_type' => 'download', 'gross_total' => 0], ];
期望输出
[ ['track_name' => 'Song A', 'transaction_type' => 'stream', 'gross_total' => 10.5], ['track_name' => 'Song A', 'transaction_type' => 'download', 'gross_total' => 0], ['track_name' => 'Song B', 'transaction_type' => 'stream', 'gross_total' => 0], ['track_name' => 'Song B', 'transaction_type' => 'download', 'gross_total' => 20.0], ];
正确实现代码
// 将已有数据转为以"track_name|transaction_type"为唯一键的关联数组,快速查找 $existingMap = []; foreach ($matching_royalty_rows as $row) { $uniqueKey = $row['track_name'] . '|' . $row['transaction_type']; $existingMap[$uniqueKey] = $row; } // 遍历全量组合,补全缺失行 $completeRows = []; foreach ($saved_royalties as $savedCombo) { $uniqueKey = $savedCombo['track_name'] . '|' . $savedCombo['transaction_type']; if (isset($existingMap[$uniqueKey])) { // 组合存在,保留原数据 $completeRows[] = $existingMap[$uniqueKey]; } else { // 组合缺失,补充gross_total为0的行 $completeRows[] = array_merge($savedCombo, ['gross_total' => 0]); } } // 输出结果 print_r($completeRows);
逻辑说明
- 构建查找映射:用
track_name和transaction_type拼接成唯一键,把已有数据存入关联数组,将组合查找的时间复杂度降到O(1),比嵌套循环效率更高。 - 补全缺失组合:遍历全量组合列表,逐个检查是否在已有映射中存在,存在则直接取用原数据,不存在则合并原组合信息与
gross_total:0后加入结果数组。 - 保持顺序一致性:最终结果数组的顺序与
$saved_royalties的全量组合顺序完全一致,符合需求。
内容的提问来源于stack exchange,提问作者InvisibleHamSandwich
相关产品推荐
相关产品推荐

