眾所周知,php腳本是弱類型語言,具有開發速度快、運行效率高等特點。但是弱類型語言也很多容易踩得坑,今天我們就來說一說php數組key默認轉換邏輯。
如下所示以下一段代碼,定義一個數組arr,其中所有的key都定義為字符串類型,下面我們輸出這個數據,看一下key的數據類型。
<?php $arr = [ "100" => "10", "10" => "1", "1" => "0.1", "0.1" => "0.01", "0.01" => "0.001" ]; ?>
輸出結果如下所示,從結果中看出,php將數字類型的默認轉換為了int類型。
array(5) { [100]=> string(2) "10" [10]=> string(1) "1" [1]=> string(3) "0.1" ["0.1"]=> string(4) "0.01" ["0.01"]=> string(5) "0.001" }
在php手冊中有一段這樣的說明:
此外 key 會有如下的強制轉換:
- 包含有合法整型值的字符串會被轉換為整型。例如鍵名 "8" 實際會被儲存為 8。但是 "08" 則不會強制轉換,因為其不是一個合法的十進制數值。
- 浮點數也會被轉換為整型,意味着其小數部分會被舍去。例如鍵名 8.7 實際會被儲存為 8。
- 布爾值也會被轉換成整型。即鍵名 true 實際會被儲存為 1 而鍵名 false 會被儲存為 0。
- Null 會被轉換為空字符串,即鍵名 null 實際會被儲存為 ""。
- 數組和對象不能被用為鍵名。堅持這么做會導致警告:Illegal offset type。
示例:
<?php $array = array( 1 => "a", "1" => "b", 1.5 => "c", true => "d", ); var_dump($array); ?>
輸出結果:
array(1) { [1]=> string(1) "d" }
上例中所有的鍵名都被強制轉換為 1,則每一個新單元都會覆蓋前一個的值,最后剩下的只有一個"d"。
這種默認的轉換會導致php按照轉換后的key重新排序,所以在對數組的key值順序有要求的情況下,一定要注意這一點,可以將100寫為0100。