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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:43:19