【问题标题】:Most optimized way to filter large multidimensional array with large indexed array使用大型索引数组过滤大型多维数组的最优化方法
【发布时间】:2020-03-16 17:05:41
【问题描述】:

我的两个数组都有超过 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 个元素的值是否存在于另一个也有超过 50 万个元素的数组需要很长时间。

// 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;
}

欢迎对更优化的解决方案提出任何建议。

提前致谢。

【问题讨论】:

    标签: php arrays multidimensional-array filter


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-19
      • 2014-05-02
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2011-04-27
      • 2010-12-25
      • 2013-04-17
      • 1970-01-01
      相关资源
      最近更新 更多