簡體   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