PHP 数组遍历 的差异(array_diff 的实现)

添加时间:13-06-16 所属分类:PHP工具与代码
  转载自http://blog.csdn.net/zuiaituantuan/article/details/6032840

题目如下:

给你两个分别有 5000 个元素的数组,计算他们的差集

-- 说白了也就是用 PHP 和你认为最好的算法实现 array_diff 的算法。

初次接到这个题目,我发现这非常的简单,于是按照以往的经验“随便”写了一个:

[code]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;

}[/code]

虽然实现是可以的,但是发现这个函数的效率是惨不忍睹。于是我又重新考虑了下,并优化了算法,第二个函数看起来是这个样子的:

[code]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;

}[/code]
嗯,这次几乎可以和原 array_diff 函数的速度媲美了。但是还有没有更优化的办法呢?由 ChinaUnix 上的一篇文章 (不好意思,作弊了),我发现 PHP 竟然可以这样写:

[code]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;

}[/code]
这个函数的效率非常的惊人,甚至比原 array_diff 函数的速度都要快。究其原因,我找到了解释:

因为键是进行 HASH 组织的,查找很快;

而 Value 只是由 Key 组织存放,本身没有索引,每次查找都是遍历。

总结

这虽然是 PHP 语言的一个小窍门,但在遍历和对比数组的值上,如果需要对比值将其与键反转的确比通常的值对值的比较效率要高得多。

比如,上面的函数二需要调用 in_array 函数需要循环判断是否在函数内;而函数三则仅仅判断这个数组是否存在该键就可以了。加上数组键和值不同的组织索引方式,效率比想象的还高那就非常可以理解了。

前篇:PHP获得数组的交集与差集 后篇:四千万贫困儿童调查:一天两顿饭 干馍馍是午...
发表我的评论


推荐文章   济南居委会网址收集   phpBB官方支持站 (英文和中文繁简体)         
随机文章   分析Discuz论坛回复可见的处理流程和原...   php的setcookie函数   PHP解决网址URL编码问题的函数urlencod...   php \u开头的编码(unicode) 转成中文   kbanka.com使用并修复帝国CMS政府红色模...
广告

其他推荐

因为本站所有内容均转载自其它媒体,本意为公众提供免费服务,但并不代表本网赞同其观点,也不能对其真实性验证负责,如稿件版权单位或个人不想在本网发布,请与我联系,本人会立即将其撤除,谢谢.联系方式:atseashawk@163.com QQ:99289555