首页 > 解决方案 > 使用大型索引数组过滤大型多维数组的最优化方法

问题描述

我的两个数组都有超过 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 数组中不存在该值。

我试过使用下面的代码,但由于数组太大,操作需要很长时间,以至于我以为我以某种方式创建了无限循环,但似乎检查另一个数组中是否存在超过 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;
}

欢迎任何有关更优化解决方案的建议。

提前致谢。

标签: phparraysmultidimensional-arrayfilter

解决方案


阅读这个问题我意识到使用 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;
}

这样做将时间缩短到几秒钟。


推荐阅读