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

如何基于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);

逻辑说明

  1. 构建查找映射:用track_name和transaction_type拼接成唯一键,把已有数据存入关联数组,将组合查找的时间复杂度降到O(1),比嵌套循环效率更高。
  2. 补全缺失组合:遍历全量组合列表,逐个检查是否在已有映射中存在,存在则直接取用原数据,不存在则合并原组合信息与gross_total:0后加入结果数组。
  3. 保持顺序一致性:最终结果数组的顺序与$saved_royalties的全量组合顺序完全一致,符合需求。

内容的提问来源于stack exchange,提问作者InvisibleHamSandwich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:51:09