PHP - самый эффективный способ фильтрации двух массивов - PullRequest
0 голосов
/ 31 мая 2018

У меня вопрос о том, как наиболее эффективно отфильтровать два массива объектов.У меня есть два массива продуктов из разных систем, и я хочу выяснить, какие продукты были удалены из одного массива, а затем вернуть продукты, которые были удалены.супер медленный

 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",
    ],
    }
]

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Вам все равно придется перебрать хотя бы один массив.Это $localProducts.Так что для $localProducts улучшений нет.Но вы можете улучшить $externalProducts - добавьте специальный метод (если можете), который будет возвращать только StockNumbers.Более эффективным будет, если StockNumbers будет иметь структуру:

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

Это улучшит ваш поиск, так как проверка isset($StockNumbers['stocknumber4']) на быстрее , чем in_array или array_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;
}
0 голосов
/ 31 мая 2018

Взгляните на array_filter

Вы можете предоставить функцию обратного вызова, которая будет запускаться для каждого элемента в массиве.Если функция обратного вызова возвращает true, текущее значение из массива возвращается в массиве результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...