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建立快速映射,避免嵌套循环降低效率,再按需求组装数组:
构建
all_items的映射数组:
把$all_items转换成以item_key为键的数组,后续查找对应元素时可直接通过键访问,无需遍历整个数组。初始化结果数组:
遍历原$all_items,为每个元素创建一个子数组,子数组第一个元素就是$all_items的当前元素。匹配并添加
invoice_items元素:
遍历$invoice_items,根据item_key找到对应的结果子数组,将当前invoice_items元素追加进去。转为数字索引数组:
用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
相关产品推荐
相关产品推荐

