如何将二维数组中具有相同键的行分组并去重合并为索引子数组

如何将二维数组中具有相同键的行分组并去重合并为索引子数组

本文介绍如何将含数值键的二维数组按键分组,合并相同键对应的全部值,并自动去重,最终生成以原键为索引、唯一值为元素的一维子数组的结构。

本文介绍如何将含数值键的二维数组按键分组,合并相同键对应的全部值,并自动去重,最终生成以原键为索引、唯一值为元素的一维子数组的结构。

在实际开发中(尤其是处理 MySQL 中存储的 JSON 字段时),我们常遇到多条记录各自携带类似 {“2”: “3”, “3”: “5”} 的 JSON 数据,需将其横向聚合:将所有记录中相同键(如 “2”)对应的值收集起来,去重后归入同一子数组。目标是将原始扁平化结构:

[
    ['2' => 3],
    ['3' => 5],
    ['2' => 4],
    ['3' => 5]
]

转换为紧凑、键值映射清晰的分组结构:

[
    2 => [3, 4],
    3 => [5]
]

实现的核心逻辑是双重遍历 + 键驱动聚合 + 去重合并。以下是推荐的健壮实现:

$result = [];

foreach ($item_options as $item_options_data) {
    // 安全解码 JSON,避免因无效 JSON 导致崩溃
    $decoded = json_decode($item_options_data['option_sons'], true);
    if (json_last_error() !== JSON_ERROR_NONE || !is_array($decoded)) {
        continue; // 跳过解析失败或非数组数据
    }

    foreach ($decoded as $key => $value) {
        // 确保键为字符串数字或整数,统一转为整型键(可选,依业务需求)
        $numericKey = is_numeric($key) ? (int)$key : $key;

        // 初始化该键对应的结果数组
        if (!isset($result[$numericKey])) {
            $result[$numericKey] = [];
        }

        // 合并当前值并自动去重(array_unique 保证值唯一性)
        $result[$numericKey] = array_values(
            array_unique(
                array_merge($result[$numericKey], [$value])
            )
        );
    }
}

// 输出标准化结果(键升序排列,可选)
ksort($result);

print_r($result);

关键要点说明:

  • 双重循环必要性:外层遍历数据库行,内层遍历每行 JSON 解析后的键值对;
  • 动态初始化:使用 !isset($result[$key]) 避免未定义索引警告,确保每个键首次出现即创建空数组;
  • 去重与合并:array_merge() 拼接新旧值,array_unique() 移除重复项,array_values() 重置数字索引(使结果更规范);
  • 健壮性增强:添加 json_last_error() 校验,防止非法 JSON 导致脚本中断;
  • 类型一致性:若业务要求键必须为整型(如示例中的 “2” → 2),建议显式转换,避免字符串键与数字键混用引发意外行为。

? 扩展提示:若后续需支持多维值(如 [“2” => [“3”, “6”]]),可改用递归合并逻辑;若性能敏感(万级数据),可考虑使用 isset() + in_array() 替代 array_unique() 以减少内存开销,但需权衡代码可读性与维护成本。

文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/jiquanzatan/127009.html

上一篇 2026-07-19 18:13
下一篇 2026-07-19 18:13

相关推荐