PHP:高效在子数组中查找关联SKU并构建目标数组
高效数组关联匹配方案
核心思路是空间换时间,先将$similar_products重构为以SKU为键的索引数组,把原本O(n)的in_array查找变成O(1)的键值访问,彻底摆脱嵌套循环的高时间复杂度问题。
步骤1:重构相似商品数组为索引结构
假设你的$similar_products结构是类似这样(每个元素包含主SKU及对应相似SKU列表):
$similar_products = [ ['sku' => 'PROD001', 'similar_skus' => ['PROD002', 'PROD003']], ['sku' => 'PROD002', 'similar_skus' => ['PROD001', 'PROD004']], // ...更多数据 ];
先把它转成键为SKU、值为相似SKU列表的关联数组:
$similar_index = []; foreach ($similar_products as $item) { $similar_index[$item['sku']] = $item['similar_skus']; }
步骤2:遍历商品数组生成最终结果
只需一次线性遍历$products,直接通过键从索引数组中取对应相似SKU(无匹配时设为空数组):
$final = []; foreach ($products as $product) { $product['similar'] = $similar_index[$product['sku']] ?? []; $final[] = $product; }
性能对比
- 原方案(嵌套循环+
in_array):时间复杂度为O(n*m),数据量越大性能下降越明显; - 优化方案:时间复杂度为O(n+m),仅需两次线性遍历,查找操作是常数时间,数据量越大优势越突出。
适配不同结构的补充
如果$similar_products是单条关联的结构(比如['main_sku' => 'PROD001', 'similar_sku' => 'PROD002']),可以先合并相同主SKU的相似项:
$similar_index = []; foreach ($similar_products as $item) { $main_sku = $item['main_sku']; $similar_index[$main_sku] = isset($similar_index[$main_sku]) ? [...$similar_index[$main_sku], $item['similar_sku']] : [$item['similar_sku']]; }
后续生成$final的逻辑保持不变即可。
内容的提问来源于stack exchange,提问作者zagzter
相关产品推荐
相关产品推荐

