PHP中按countries子数组分组产品数组并合并相同组的问题
PHP多维数组按子数组分组解决方案
当需要按countries子数组对产品进行分组时,由于PHP数组的键只能是字符串或整数,直接用子数组当分组键会报错。解决核心是把子数组转换成唯一可哈希的字符串,以此作为分组标识,再完成合并。
实现步骤
- 对每个元素的
countries子数组排序(确保元素相同但顺序不同的数组能被识别为同一组) - 将排序后的子数组序列化为字符串(作为分组键)
- 遍历原数组,按序列化后的键收集产品,最后整理成目标结构
完整代码示例
// 示例输入数组 $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
相关产品推荐
相关产品推荐

