两个分别有 5000 个元素的数组,计算他们的差集,也就是用 PHP 和你认为最好的算法实现 array_diff 的算法
$StartTime = microtime(true); // 程序运行起始时间
// 模拟两个5000量级的数组
for($i=0;$i<4999;$i++){
$array_1[] = $i;
}
for($k=4800;$k<9899;$k++){
$array_2[] = $k;
}
输出两个数组:
$array_1:
Array
( [0] => 0 [1] => 1 [2] => 2 [3] => 3 ...
[4997] => 4997 [4998] => 4998 )
$array_2:
Array
( [0] => 4800 [1] => 4801 ...
[5097] => 9897 [5098] => 9898 )
方法一:
/*
$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;
}
}*/
// 2,347.2552毫秒
虽然实现是可以的,但是发现这个函数的效率是惨不忍睹。于是我又重新考虑了下,并优化了算法
// 方法二:
/*
foreach ($array_1 as $key => $item) {
if (in_array($item, $array_2, true)) {
unset($array_1[$key]);
}
}
*/
// 304.5480毫秒
这次几乎可以和原 array_diff 函数的速度媲美了。但是还有没有更优化的办法呢?
// 方法三:
$array_2 = array_flip($array_2); // 交换数组的键和值
foreach ($array_1 as $key => $item) {
if (isset($array_2[$item])) {
unset($array_1[$key]);
}
} // 15.0731毫秒
这个函数的效率非常的惊人,甚至比原 array_diff 函数的速度都要快。究其原因,我找到了解释:
因为键是进行 HASH 组织的,查找很快;而 Value 只是由 Key 组织存放,本身没有索引,每次查找都是遍历。
总结:
这虽然是 PHP 语言的一个小窍门,但在遍历和对比数组的值上,如果需要对比值将其与键反转的确比通常的值对值的比较效率要高得多。比如,上面的函数二需要调用 in_array 函数需要循环判断是否在函数内;而函数三则仅仅判断这个数组是否存在该键就可以了。
加上数组键和值不同的组织索引方式,效率比想象的还高那就非常可以理解了。
$StopTime = microtime(true);
$TimeSpent=$StopTime-$StartTime;
echo number_format($TimeSpent*1000, 4).'毫秒'; // 897.6068毫秒
转载:
http://bbs.chinaunix.net/thread-1032441-1-1.html
代码稍微加了点运行时间
@todo
http://www.jb51.net/article/29949.htm
http://blog.csdn.net/guguyu/article/details/45152283
相关推荐
了解这些遍历方法和指针操作函数对于有效地处理PHP数组至关重要。选择哪种方法取决于具体需求,例如,`foreach` 对于大多数情况是最方便的,而 `while` 结合 `each()` 则提供了更多的控制。在性能敏感的应用中,可能...
在 PHP 中,数组遍历和比较是常见的操作,特别是在处理数据集合时。本文主要探讨了如何高效地实现数组差集的计算,即找到一个数组中不在另一个数组中的元素。题目中给出了三种不同的实现方法,分别是原始的双层循环...
数组的特殊操作在处理复杂数据时尤其有用,本篇文章将深入探讨PHP数组的一些高级特性、操作技巧以及相关的工具。 首先,PHP提供了两种类型的数组:索引数组和关联数组。索引数组使用数字作为键,通常是从0开始的,...
其次,`while`循环配合`list()`和`each()`函数也可以实现数组遍历。`each()`函数返回数组当前的键值对,`list()`则可以用来解包这些值。如下所示: ```php $urls = array('aaa', 'bbb', 'ccc', 'ddd'); while (list...
它的语法结构清晰,适用于大多数数组遍历场景。例如: ```php $urls = array('aaa', 'bbb', 'ccc', 'ddd'); foreach ($urls as $url) { echo "This Site url is $url! "; } ``` `foreach`循环遍历数组时,会...
下面是对PHP数组和链表之间区别的详细解释。 1. **逻辑结构** - **数组**:数组是一种线性数据结构,其所有元素在内存中是连续存储的。在PHP中,数组可以存储不同类型的数据,并且可以通过索引(下标)快速访问。...
差集函数用于找出两个或多个数组之间的差异。 - **array_diff()**: 返回相对于第一个数组中不在其他数组中的元素。 - **array_udiff_assoc()**: 使用用户自定义的比较函数返回相对于第一个数组中不在其他数组中的...
在PHP编程中,遍历数组是一项基础且重要的任务,它允许我们访问并处理数组中的每一个元素。本文将详细解析PHP中三种主要的遍历数组的方法:`foreach`、`while`以及`for`循环,同时也会介绍与遍历相关的辅助函数`key...
在本篇"PHP开发笔记系列(九)- 数组(三)"中,我们将深入探讨PHP数组的高级用法,包括关联数组、多维数组以及数组函数的使用。 一、关联数组 关联数组是PHP数组的一种类型,其中的键和值之间存在关联关系,键可以...
总的来说,理解数组和链表的差异是提升编程技能的关键步骤,这有助于我们在编写代码时根据实际需求选择最合适的数据结构,从而提高程序性能和可维护性。在PHP的开发实践中,熟练掌握这两种数据结构及其应用场合,能...
数组遍历指的是按照一定的顺序访问数组中的每个元素,通常是为了执行某些操作,比如读取元素的值、进行计算或修改元素等。常见的遍历方法包括for循环、while循环和foreach循环。 接着,文章演示了三种不同循环结构...
- `current()`、`each()`和`end()`则用于数组遍历,分别返回当前元素、当前键/值对并前进指针,以及将指针移到数组末尾。 这些函数构成了PHP处理数组的强大工具集,无论是在数据处理、数据过滤、数据合并还是排序...
在创建PHP数组时,我们经常会在索引前后加上引号或者不加。那么,PHP数组索引的Key加引号和不加引号到底有何区别呢?这个问题源于PHP解析数组索引时的一种特性。 首先,让我们深入理解PHP解析数组索引的方式。如果...
`count()` 和 `sizeof()`)、数组操作函数(如 `explode()`、`implode()`、`array_merge()`、`array_diff()` 等)以及遍历数组的不同方式(如 `foreach` 循环、`for` 循环等),使得PHP在处理数组时具有极大的灵活性...
本知识点将详细解释foreach和while在数组遍历中的行为差异,以及如何在不同场景下选择合适的遍历方法。 首先,foreach是PHP提供的一个简洁的数组遍历结构,专门用于遍历数组和对象属性。foreach内部实现是对数组的...
在实际开发中,选择合适的方法来遍历目录下的特定文件还需要考虑其他因素,例如文件的权限、文件系统的差异、以及性能问题等。例如,如果是在Web环境中,你可能需要考虑PHP的执行时长限制,避免因目录遍历操作耗时过...
在PHP编程中,判断一个数组是否为另一个数组的子集是一项常见的任务,这涉及到数组的比较和搜索操作。本文将详细介绍三种不同的PHP方法来实现这一功能,并解释它们的工作原理。 ### 1. 使用 `foreach` 循环和 `in_...
综上所述,在进行PHP数组去重操作时,推荐优先使用array_unique函数,尤其是面对大型数组时,该函数不仅可以提高代码的执行效率,还能减少代码量,提高代码的可读性和可维护性。而在数组规模较小的情况下,foreach...