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

PHP中如何按item_key匹配二维数组并生成指定结构新数组?

PHP数组匹配组合解决方案

现有两个PHP二维数组$all_items和$invoice_items,需求如下:

  • 将$invoice_items中item_key与$all_items中item_key匹配的元素,和对应的$all_items元素组合成新数组
  • 新数组结构需参考下方示例

用户尝试直接循环对比并推送值,最终只得到一个无分组的大数组,因对PHP数组操作方法不熟悉,寻求解决思路。

示例数据集

$all_items = [
    [
        'name' => 'item1',
        'description' => 'item 1',
        'item_key' => 123
    ],
    [
        'name' => 'item2',
        'description' => 'item 2',
        'item_key' => 456
    ],
    [
        'name' => 'item3',
        'description' => 'item 3',
        'item_key' => 789
    ]
];

$invoice_items = [
    [
        'item_key' => 123,
        'desc' => '1item'
    ],
    [
        'item_key' => 456,
        'desc' => '2item'
    ],
    [
        'item_key' => 123,
        'desc' => '3item'
    ],
    [
        'item_key' => 345,
        'desc' => '4item'
    ],
    [
        'item_key' => 123,
        'desc' => '5item'
    ],
    [
        'item_key' => 345,
        'desc' => '6item'
    ],
    [
        'item_key' => 123,
        'desc' => '7item'
    ]
];

期望输出

Array (
   [0] => Array (
      [0] => Array ( [name] => item1 [description] => item 1 [item_key] => 123 ),
      [1] => Array ( [item_key] => 123 [desc] => 1item ),
      [2] => Array ( [item_key] => 123 [desc] => 3item ),
      [3] => Array ( [item_key] => 123 [desc] => 5item ),
      [4] => Array ( [item_key] => 123 [desc] => 7item )
   )

   [1] => Array (
      [0] => Array ( [name] => item2 [description] => item 2 [item_key] => 456 ),
      [1] => Array ( [item_key] => 456 [desc] => 2item ),
   )

   [2] => Array (
      [0] => Array ( [name] => item3 [description] => item 3 [item_key] => 789 )
   )
)

解决方案

核心思路是通过item_key建立快速映射,避免嵌套循环降低效率,再按需求组装数组:

  1. 构建all_items的映射数组:
    把$all_items转换成以item_key为键的数组,后续查找对应元素时可直接通过键访问,无需遍历整个数组。

  2. 初始化结果数组:
    遍历原$all_items,为每个元素创建一个子数组,子数组第一个元素就是$all_items的当前元素。

  3. 匹配并添加invoice_items元素:
    遍历$invoice_items,根据item_key找到对应的结果子数组,将当前invoice_items元素追加进去。

  4. 转为数字索引数组:
    用array_values()去掉原有的item_key键,确保结果是连续数字索引数组,和期望输出结构一致。

完整代码示例

// 构建all_items的item_key映射
$allItemsMap = [];
foreach ($all_items as $item) {
    $allItemsMap[$item['item_key']] = $item;
}

// 初始化结果数组
$result = [];
foreach ($all_items as $item) {
    $result[$item['item_key']] = [$item];
}

// 遍历invoice_items,匹配并追加到对应分组
foreach ($invoice_items as $invoiceItem) {
    $key = $invoiceItem['item_key'];
    if (isset($result[$key])) {
        $result[$key][] = $invoiceItem;
    }
}

// 转为数字索引数组,和期望输出结构一致
$result = array_values($result);

// 打印结果查看
echo '<pre>';
print_r($result);
echo '</pre>';

代码说明

  • 构建映射数组将查找时间复杂度从O(n)降到O(1),数据量大时性能优势明显
  • 初始化结果数组时直接保留所有all_items元素,确保即使没有匹配的invoice_items也能被包含
  • array_values()转换索引后,输出结构完全匹配示例要求

内容的提问来源于stack exchange,提问作者Sarah Carter-Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:24:50