Php 使用阵列_diff处理大型阵列

Php 使用阵列_diff处理大型阵列,php,Php,我一直在尝试比较两个数组。使用数组_intersect不会出现问题。当使用数组_diff和约5000个值的数组时,它可以工作。当我得到~10000个值时,当我得到array_diff时,脚本就消失了。打开error_报告并没有产生任何结果 我尝试创建自己的数组_diff函数: function manual_array_diff($arraya, $arrayb) { foreach ($arraya as $keya => $valuea) { if (in_ar

我一直在尝试比较两个数组。使用数组_intersect不会出现问题。当使用数组_diff和约5000个值的数组时,它可以工作。当我得到~10000个值时,当我得到array_diff时,脚本就消失了。打开error_报告并没有产生任何结果

我尝试创建自己的数组_diff函数:

function manual_array_diff($arraya, $arrayb) {
    foreach ($arraya as $keya => $valuea) {
        if (in_array($valuea, $arrayb)) {
            unset($arraya[$keya]);
        }
    }
    return $arraya;
}
资料来源:

我希望它的效率低于官方的数组_diff,但它可以处理~10000个数组。不幸的是,当我到达~15000时,两个阵列的差异都失败了

我在另一台机器上尝试了相同的代码,它运行良好,因此代码或PHP没有问题。在那个特定的服务器上一定有一些限制。你知道我该如何绕过这个限制、改变它或只是找出它是什么吗?

在我的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服务器错误日志(如果您通过其中一个运行此日志)?

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

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

所以,我必须找到自己的方法来解决这个问题,并想出了下面这个丑陋的乱七八糟的东西,它为我提供了大约50000个元素的数组。根据您的观察,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;
}

你用什么数据测试它?可能是因为这个算法是O(N^2)。你是在浏览器或命令行中运行它吗?数据是一堆ID。在浏览器中运行。执行只需几秒钟,所以执行时间不是问题。手动降低一台计算机上的内存限制确实会终止脚本。但是,在另一台机器上设置更高的内存限制并不能解决问题。如果您感到好奇,最初是机器上的40米造成了问题。