PHP中高效过滤两个对象数组的最优实现方案问询
高效过滤两个产品数组的优化方案
嘿,我完全懂你现在的困扰——当产品数组的规模上去之后,原来用in_array的实现确实会变得很慢,因为每次查找都是线性遍历,数据量越大拖得越厉害。咱们直接把这个逻辑优化成线性时间复杂度的版本,性能会有质的提升。
原方法的性能瓶颈
你原来的代码里,把外部产品的SKU存进普通数组后,用in_array去检查本地产品的SKU是否存在。in_array每次查找的时间复杂度是O(k)(k是外部SKU数组的长度),如果本地有m个产品,总时间复杂度就是O(m*k)——举个例子,要是外部有1000个SKU、本地有1000个产品,就得做100万次对比,这肯定快不起来。
优化思路:用哈希表(关联数组)实现O(1)查找
核心就是把外部的SKU数组改成关联数组(哈希表),让SKU作为数组的键。哈希表的键查找操作平均时间复杂度是O(1),不管数组多大,查找都几乎是瞬间完成的。这样整体时间复杂度就降到了O(k + m),效率提升非常明显。
优化后的代码实现
基础版本
public function checkRemove($externalProducts, $localProducts) { // 将外部产品的非空SKU存入关联数组,键为SKU,值标记为存在 $externalSkuMap = []; foreach ($externalProducts->products as $product) { if ($product->StockNumber !== null) { $externalSkuMap[$product->StockNumber] = true; } } $productsRemove = []; foreach ($localProducts->products as $localProduct) { // 用isset快速判断SKU是否存在于外部数组中 if (!isset($externalSkuMap[$localProduct->sku])) { $productsRemove[] = $localProduct; } } return $productsRemove; }
简化版本(PHP 7.4+)
如果你的PHP版本支持,可以用array_column和array_flip简化外部SKU映射的生成,代码更简洁:
public function checkRemove($externalProducts, $localProducts) { // 提取所有非空的外部SKU,然后转成键为SKU的关联数组 $externalSkus = array_filter(array_column($externalProducts->products, 'StockNumber')); $externalSkuMap = array_flip($externalSkus); $productsRemove = []; foreach ($localProducts->products as $localProduct) { if (!isset($externalSkuMap[$localProduct->sku])) { $productsRemove[] = $localProduct; } } return $productsRemove; }
验证示例数据
用你提供的测试数据来验证:
- 外部产品的SKU:
180220/003、180221/004、150804/012 - 本地产品的SKU:
180514/001、180221/004、150804/012
优化后的函数会正确返回SKU为180514/001的「Fur Coat」产品,也就是本地存在但外部已移除的产品,符合你的需求。
内容的提问来源于stack exchange,提问作者SimonBL
相关产品推荐
相关产品推荐

