
本文介绍如何将含数值键的二维数组按键分组,合并相同键对应的全部值,并自动去重,最终生成以原键为索引、唯一值为元素的一维子数组的结构。
本文介绍如何将含数值键的二维数组按键分组,合并相同键对应的全部值,并自动去重,最终生成以原键为索引、唯一值为元素的一维子数组的结构。
在实际开发中(尤其是处理 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