php 陣列遍歷奇怪現象

馬九南發表於2021-05-07
<?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:本來想畫個結構圖的,太麻煩了,略。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
只不過是一粒塵埃罷了

相關文章