PHP合并两个数组:匹配page_id将value合并为数组
PHP数组合并:按page_id聚合value到元数据数组
核心思路
先把Array2预处理成page_id为键、对应value数组为值的映射表,避免嵌套循环的冗余操作,再遍历Array1直接匹配映射表完成合并,既高效又不会出现重复元素。
代码实现
1. 示例数组(模拟你的数据结构)
$array1 = [ ['id' => 1, 'name' => '首页', 'page_id' => 100], ['id' => 2, 'name' => '列表页', 'page_id' => 200], ['id' => 3, 'name' => '详情页', 'page_id' => 300] ]; $array2 = [ ['page_id' => 100, 'value' => 'banner1'], ['page_id' => 100, 'value' => 'banner2'], ['page_id' => 200, 'value' => 'sidebar'], ['page_id' => 300, 'value' => 'footer'], ['page_id' => 300, 'value' => 'header'] ];
2. 预处理Array2,构建page_id到value数组的映射
$pageValueMap = []; foreach ($array2 as $item) { $pageId = $item['page_id']; // 初始化空数组,避免索引未定义报错 if (!isset($pageValueMap[$pageId])) { $pageValueMap[$pageId] = []; } // 将当前value追加到对应page_id的数组中 $pageValueMap[$pageId][] = $item['value']; }
3. 遍历Array1,合并对应value数组
// 用引用遍历,直接修改原数组元素 foreach ($array1 as &$pageMeta) { $currentPageId = $pageMeta['page_id']; // 匹配映射表,存在则赋值对应value数组,否则设为空数组(按需调整) $pageMeta['values'] = $pageValueMap[$currentPageId] ?? []; } // 释放引用,防止后续操作污染数组 unset($pageMeta);
处理后结果
print_r($array1); // 输出: Array ( [0] => Array ( [id] => 1 [name] => 首页 [page_id] => 100 [values] => Array ( [0] => banner1 [1] => banner2 ) ) [1] => Array ( [id] => 2 [name] => 列表页 [page_id] => 200 [values] => Array ( [0] => sidebar ) ) [2] => Array ( [id] => 3 [name] => 详情页 [page_id] => 300 [values] => Array ( [0] => footer [1] => header ) ) )
解决你之前的重复问题
你之前用嵌套循环+array_merge_recursive出现重复,是因为每次匹配到page_id时都会执行合并,相当于多次把单个value往数组里合并,重复操作导致元素冗余。而先预处理映射表的方式,每个page_id的value数组只构建一次,再直接赋值给Array1,完全避免了重复合并的问题。
可选扩展
- 如果需要对value去重,在预处理时可以加判断:
if (!in_array($item['value'], $pageValueMap[$pageId])) $pageValueMap[$pageId][] = $item['value']; - 如果Array1中存在Array2没有的page_id,上述代码用
?? []会自动赋值空数组,无需额外处理。
内容的提问来源于stack exchange,提问作者Hunter Sweat
相关产品推荐
相关产品推荐

