使用array_diff处理大型数组

时间:2010-06-06 20:31:30

标签: 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;
}

来源:How does array_diff work?

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

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

3 个答案:

答案 0 :(得分:4)

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

所以,我必须找到自己的方式,并提出以下丑陋的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;
}

答案 1 :(得分:1)

在我的php.ini中:

max_execution_time = 60     ; Maximum execution time of each script, in seconds
memory_limit = 32M          ; Maximum amount of memory a script may consume

这些设置或机器性能的差异是否会导致问题?您是否检查过Web服务器错误日志(如果您通过其中运行此错误日志)?

答案 2 :(得分:1)

您提到这是在浏览器中运行。尝试通过命令行运行脚本,看看结果是否不同。