php 数组遍历奇怪现象

PHP技术
356
0
0
2022-04-11
<?php
$arr[2] = 'maxiao';
$arr[1] = 2015;
$arr[0] = 2014;
foreach ($arr as $key => $val) {
echo $val . ' ';
}

使用foreach遍历,结果是:

maxiao  2015  2014

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

使用for遍历,结果是:

2014  2015  maxiao

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

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

https://www.laruence.com/2009/08/23/1065.html。

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