Наиболее оптимизированный способ фильтрации большого многомерного массива с большим индексированным массивом - PullRequest
0 голосов
/ 16 марта 2020

В обоих моих массивах содержится более 500 000 элементов.

Я хотел бы вернуть только те элементы из многомерного массива, которые НЕТ в индексированном массиве.

Вот как выглядит мой многомерный массив:

$new_codes = [
   0 => [
            'id' => 1,
            'code' => 'code1',
            ... another values
   ],
   1 => [
            'id' => 2,
            'code' => 'code2',
            ... another values
   ],
   2 => [
            'id' => 3,
            'code' => 'code3',
            ... another values
   ]
];

Другой массив - это просто индексированный массив со значениями кода:

$old_codes = [
      'code1',
      'code2',
];

В этом ограниченном примере после фильтрации $ new_codes должен только иметь индекс 2 , потому что это значение не существует в массиве $ old_codes.

Я пытался использовать приведенный ниже код, но поскольку массивы настолько велики, операция занимает так много времени, что Я думал, что каким-то образом создал бесконечное l oop, но кажется, что проверка, существуют ли значения для более 500000 элементов в другом массиве, который также содержит более полумиллиона элементов, занимает очень много времени.

// option 1
$new = array_filter($new_codes, function ($var) use ($old_codes) {
            return !in_array($var['code'], $old_codes);
        });

// option 2
$filtered = [];
foreach($new_codes as $code) {
    if(in_array($code['code']){
         continue;
     }

    $filtered[] = $code;
}

Любые предложения по более оптимизированным решениям приветствуются.

Заранее спасибо.

1 Ответ

0 голосов
/ 16 марта 2020

Чтение этот вопрос. Я понял, что использование isset () - гораздо лучший вариант для обработки такого большого количества элементов, поэтому я сделал это:

// switch array keys and values
$old_array = array_flip($old_array);

foreach($new_codes as $code) {
    if(isset($old_array[$code['code']])){
         continue;
     }

    $filtered[] = $code;
}

Это уменьшило время до нескольких секунд.

...