php 数组遍历奇怪现象

PHP技术
322
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:本来想画个结构图的,太麻烦了,略。