Php 使用阵列_diff处理大型阵列
我一直在尝试比较两个数组。使用数组_intersect不会出现问题。当使用数组_diff和约5000个值的数组时,它可以工作。当我得到~10000个值时,当我得到array_diff时,脚本就消失了。打开error_报告并没有产生任何结果 我尝试创建自己的数组_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
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米造成了问题。