使用array_diff处理大型数组

bur*_*ger 7 php

我一直在尝试比较两个数组.使用array_intersect没有问题.使用带有~5,000个值的array_diff和数组时,它可以正常工作.当我达到~10,000个值时,脚本会在到达array_diff时死亡.启用error_reporting没有产生任何结果.

我尝试创建自己的array_diff函数:

function manual_array_diff($arraya, $arrayb) {
    foreach ($arraya as $keya => $valuea) {
        if (in_array($valuea, $arrayb)) {
            unset($arraya[$keya]);
        }
    }
    return $arraya;
}
Run Code Online (Sandbox Code Playgroud)

来源:array_diff如何工作?

我希望它比官方的array_diff效率低,但它可以处理~10,000的数组.不幸的是,当我达到~15,000时,array_diff都失败了.

我在不同的机器上尝试了相同的代码,它运行正常,所以它不是代码或PHP的问题.在该特定服务器上某处必须设置一些限制.知道如何绕过这个限制或改变它或者只是找出它是什么?

小智 6

遇到了完全相同的问题,我真的希望在这里得到答案。

所以,我必须找到自己的方法来解决它,并提出了以下丑陋的 kludge,它对我有大约 50,000 个元素的数组。根据您的观察,array_intersect 有效但 array_diff 无效。

迟早这也会溢出资源限制,在这种情况下,有必要对数组进行分块并处理较小的位。当我们来到它时,我们将穿过那座桥。

function new_array_diff($arraya, $arrayb) {
    $intersection = array_intersect($arraya, $arrayb);
    foreach ($arraya as $keya => $valuea) {
        if (!isset($intersection[$keya])) {
            $diff[$keya] = $valuea;
        }
    }

    return $diff;
}
Run Code Online (Sandbox Code Playgroud)