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

PHP中按countries子数组分组产品数组并合并相同组的问题

PHP多维数组按子数组分组解决方案

当需要按countries子数组对产品进行分组时,由于PHP数组的键只能是字符串或整数,直接用子数组当分组键会报错。解决核心是把子数组转换成唯一可哈希的字符串,以此作为分组标识,再完成合并。

实现步骤

  1. 对每个元素的countries子数组排序(确保元素相同但顺序不同的数组能被识别为同一组)
  2. 将排序后的子数组序列化为字符串(作为分组键)
  3. 遍历原数组,按序列化后的键收集产品,最后整理成目标结构

完整代码示例

// 示例输入数组
$products = [
    ['product' => 'basic', 'countries' => ['US', 'CA', 'UK']],
    ['product' => 'pro', 'countries' => ['CA', 'US', 'UK']],
    ['product' => 'enterprise', 'countries' => ['DE', 'FR']],
    ['product' => 'starter', 'countries' => ['DE', 'FR']],
];

$grouped = [];

foreach ($products as $item) {
    // 排序countries数组,消除顺序差异的影响
    $sortedCountries = $item['countries'];
    sort($sortedCountries);
    
    // 转换为唯一字符串作为分组键(serialize或json_encode均可)
    $groupKey = serialize($sortedCountries);
    
    if (!isset($grouped[$groupKey])) {
        // 初始化分组
        $grouped[$groupKey] = [
            'products' => [$item['product']],
            'countries' => $item['countries'] // 若需要统一顺序,可替换为$sortedCountries
        ];
    } else {
        // 追加产品到已有分组
        $grouped[$groupKey]['products'][] = $item['product'];
    }
}

// 移除关联键,转为索引数组
$result = array_values($grouped);

// 打印结果
print_r($result);

代码说明

  • 排序子数组:避免因元素顺序不同导致相同国家集合被误判为不同组
  • 序列化方式:
    • serialize():PHP专用序列化,转换后的字符串唯一且体积小
    • json_encode():通用格式,可读性更强,适合跨语言场景
  • 最终转换:用array_values()将关联数组转为索引数组,符合目标结构要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:40:34