繁体   English   中英

PHP-筛选两个数组的最有效方法

[英]PHP - Most efficient way to filter two arrays

我对过滤两个对象数组的最有效方式有疑问。 我有两套来自不同系统的产品,我想弄清楚哪些产品已从一个阵列中删除,然后退回已删除的产品。

看到我下面的当前功能,我知道这是超级慢的。

 public function checkRemove($externalProducts, $localProducts){
    //Push all the SKU codes from feed to an array();
    $arr = [];
    foreach ($externalProducts->products as $product) {
        if($product->StockNumber != null){
            array_push($arr, $product->StockNumber);
        }
    }
    //Loop through the local products 
    $productsRemove = [];
    foreach ($localProducts->products as $key => $localProduct) {
        if(in_array($localProduct->sku, $arr)){

        }else{
            array_push($productsRemove, $localProduct);
        }
    }    
    return $productsRemove;
}

$externalProducts = {
"Filter": {
    "Title": "All Products"
},
"Products": [{
        "Type": "Jacket",
        "Price": 75,
        "ExpiryDate": "2018-06-30",
        "StockNumber": "180220/003",
        "Created": "2018-02-20 12:24:06",
        "Modified": "2018-05-30 02:00:23"
    },
    {
        "Type": "Jeans",
        "Price": 150,
        "ExpiryDate": "2018-06-30",
        "StockNumber": "180221/004",
        "Created": "2017-08-10 15:11:44",
        "Modified": "2018-05-30 02:00:22"
    },
    {
        "Type": "Jacket",
        "Price": 240,
        "ExpiryDate": "2018-06-30",
        "StockNumber": "150804/012",
        "Created": "2015-08-04 17:03:42",
        "Modified": "2018-05-30 02:00:22"
    }
    ]
}
$internalProducts = "localProducts": [{
    "title": "Fur Coat",
    "id": 16526,
    "created_at": "2018-05-17T10:15:45Z",
    "updated_at": "2018-05-17T10:15:45Z",
    "sku": "180514/001",
    "price": "75.00",
    "regular_price": "75.00",
    "categories": [
        "Jackets",
    ],
},
{
    "title": "Ripped Jeans",
    "id": 16527,
    "created_at": "2018-05-17T10:15:45Z",
    "updated_at": "2018-05-17T10:15:45Z",
    "sku": "180221/004",
    "price": "150.00",
    "regular_price": "150.00",
    "categories": [
        "Jeans",
    ],
},
{
    "title": "Leather Jacket",
    "id": 16528,
    "created_at": "2018-05-17T10:15:45Z",
    "updated_at": "2018-05-17T10:15:45Z",
    "sku": "150804/012",
    "price": "240.00",
    "regular_price": "240.00",
    "categories": [
        "Jackets",
    ],
    }
]

看看array_filter

您可以提供将对数组中的每个元素运行的回调函数。 如果回调函数返回true,则在结果数组中返回数组的当前值。

您仍然至少必须迭代一个数组。 这是$localProducts 因此,对于$localProducts没有任何改进。 但是您可以改善$externalProducts添加一个特殊方法(如果可以的话),该方法将仅返回StockNumbers 如果StockNumbers具有以下结构,则将更有效:

[
    'stocknumber1' => true,
    'stocknumber2' => true,
    'stocknumber3' => true,
    'stocknumber4' => true,
    'stocknumber5' => true,
]

这将改善您的搜索,因为检查isset($StockNumbers['stocknumber4'])in_arrayarray_search 更快

如果您无法更改$externalProducts->products结构,则可以在循环中构建库存编号数组:

public function checkRemove($externalProducts, $localProducts){
    //Push all the SKU codes from feed to an array();
    $arr = [];
    foreach ($externalProducts->products as $product) {
        if ($product->StockNumber != null){
            // Again I add sku as key, not as value
            $arr[$product->StockNumber] = true;
        }
    }

    //Loop through the local products 
    $productsRemove = [];
    foreach ($localProducts->products as $localProduct) {
        // check with `isset` is faster
        if (isset($arr[$localProduct->sku])) {
            array_push($productsRemove, $localProduct);
        }
    }    
    return $productsRemove;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM