初次接到这个题目,我发现这很是的简单,因而按照以往的经验“随便”写了一个:
function array_diff($array_1, $array_2) {
$diff = array();
foreach ($array_1 as $k => $v1) {
$flag = false;
foreach ($array_2 as $v2) {
if ($flag = ($v1 == $v2)) {
break;
}
}
if (!$flag) {
$diff[$k] = $v1;
}
}
return $diff;
}php
虽然实现是能够的,可是发现这个函数的效率是惨不忍睹。因而我又从新考虑了下,并优化了算法,第二个函数看起来是这个样子的:
function array_diff($array_1, $array_2) {
foreach ($array_1 as $key => $item) {
if (in_array($item, $array_2, true)) {
unset($array_1[$key]);
}
}
return $array_1;
}算法
嗯,此次几乎能够和原 array_diff 函数的速度媲美了。可是还有没有更优化的办法呢?由 ChinaUnix 上的一篇文章(很差意思,做弊了),我发现 PHP 居然能够这样写:
function array_diff($array_1, $array_2) {
$array_2 = array_flip($array_2);
foreach ($array_1 as $key => $item) {
if (isset($array_2[$item])) {
unset($array_1[$key]);
}
}
return $array_1;
}数组
这个函数的效率很是的惊人,甚至比原 array_diff 函数的速度都要快。究其缘由,我找到了解释:
由于键是进行 HASH 组织的,查找很快;
而 Value 只是由 Key 组织存放,自己没有索引,每次查找都是遍历。
总结
这虽然是 PHP 语言的一个小窍门,但在遍历和对比数组的值上,若是须要对比值将其与键反转的确比一般的值对值的比较效率要高得多。
好比,上面的函数二须要调用 in_array 函数须要循环判断是否在函数内;而函数三则仅仅判断这个数组是否存在该键就能够了。
加上数组键和值不一样的组织索引方式,效率比想象的还高那就很是能够理解了。函数