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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:33:29