深入理解PHP原理之foreach

我们走得太快,灵魂都跟不上了 ...
今天偶然看到鸟哥(php)的博客‘ 深入理解PHP原理之foreach’,可惜自己功力尚欠,内部的机理看不明白,但也稍微记录一下,毕竟这个问题自己以前从来没有考虑过。 #### 以下内容摘自鸟哥的博客 经常会有人问我, PHP的数组, 如果用foreach来访问, 遍历的顺序是固定的么? 以什么顺序遍历呢? 比如:
1
2
3
4
5
6
7
<?php
$arr['laruence'] = 'huixinchen';
$arr['yahoo'] = 2007;
$arr['baidu'] = 2008;
foreach ($arr as $key => $val) {
//结果是什么?
}
结果: huixinchen20072008

又比如:

1
2
3
4
5
6
7
<?php
$arr[2] = 'huixinchen';
$arr[1] = 2007;
$arr[0] = 2008;
foreach ($arr as $key => $val) {
//现在结果又是什么?
}

结果:
huixinchen 2007 2008

要完全了解清楚这个问题, 我想首先应该要大家了解PHP数组的内部实现结构………
在PHP中, 数组是用一种HASH结构(HashTable)来实现的, PHP使用了一些机制, 使得可以在O(1)的时间复杂度下实现数组的增删, 并同时支持线性遍历和随机访问.

说明

PHP中遍历数组的顺序, 是和元素的添加先后相关的;
所以, 如果你想在数字索引的数组中按照索引大小遍历, 那么你就应该使用for, 而不是foreach

1
2
3
for($i=0,$l=count($arr); $i<$l; $i++) {
//这个时候,不能认为是顺序遍历(线性遍历)
}