php 数组遍历奇怪现象

1
2
3
4
5
6
7
<?php
$arr[2] = 'maxiao';
$arr[1] = 2015;
$arr[0] = 2014;
foreach ($arr as $key => $val) {
echo $val . ' ';
}

使用foreach遍历,结果是:

1
maxiao 2015 2014

1
2
3
4
$length = count($arr);
for($i = 0;$i < $length;$i++) {
echo $arr[$i] . ' ';
}

使用for遍历,结果是:

1
2014 2015 maxiao 

啊这。。foreach为什么不是按索引来遍历?而是按照添加元素的时间来遍历的。

这涉及到来php数组的底层实现,简单来说,php数据底层是一个hashtable(用链表的方式来解决hash冲突)+ 双向链表进行组织的数据,而采用foreach遍历数组的话,会根据链表来遍历,链表的顺序是添加元素的顺序。而如果用for来遍历数组的话,使用的是hashtable来查找元素。所以顺序是索引的顺序。大佬的讲解:
https://www.laruence.com/2009/08/23/1065.html。

ps:本来想画个结构图的,太麻烦了,略。

作者

John Doe

发布于

2021-05-06

更新于

2021-05-06

许可协议

评论