这是简单的算法。
>翻转第一个数组。价值将成为钥匙。所以重复的值将被丢弃。
>翻转第二阵列(可选)
>检查第二个数组中的每个元素是否存在于第一个数组中。
当您使用非常大的数组时,会消耗大量内存。
这是我的实现,
$a = file("l.a"); // l.a is a file contains 2,500,000 lines
$b = file("l.b");
function large_array_diff($b, $a){
// Flipping
$at = array_flip($a);
$bt = array_flip($b);
// checking
$d = array_diff_key($bt, $at);
return array_keys($d);
}
我使用4G内存限制运行它。 3G也可以。刚刚测试
$ time php -d memory_limit=4G diff_la.php
大概需要11秒!
real 0m10.612s
user 0m8.940s
sys 0m1.460s
UPDATE
以下代码比上述的large_array_diff函数快两倍。
function flip_isset_diff($b, $a) {
$at = array_flip($a);
$d = array();
foreach ($b as $i)
if (!isset($at[$i]))
$d[] = $i;
return $d;
}
因为它不调用array_flip(1次),array_diff_key和array_keys。由此可节省许多CPU周期。