關於PHP數組Key的強制類型轉換

PHP是弱類型語言,就像JavaScript同樣,在定義變量時,不須要強制指定變量的類型。同時,PHP又有着強大的數組功能,數組的Key便可以是普通的數字類型下標,也能夠是字符串類型的Hash鍵值,那麼,當一個數組的Key同時擁有字符串和數字時,會產生什麼狀況呢?php

首先來看下面這樣一段代碼:git

$arr = [
    "1" => "a",
    "01" => "b",
    1 => "aa",
    1.1 => "aaa",
    "0.1" => "bb",
];

var_dump($arr);

// array(3) {
//     [1] =>
//     string(3) "aaa"
//     '01' =>
//     string(1) "b"
//     '0.1' =>
//     string(2) "bb"
// }

咦?咱們定義的"1"、1下標的值都變成了1.1的"aaa"了?github

沒錯,PHP中的數組Key值只接受數字和字符串類型,當Key是字符串時,會強強制轉換爲數字類型,遵照類型強制轉換的規則。浮點數也是一樣的道理,直接轉換成了向下取整的整型。面試

那麼"0.1"和"01"爲何還在?首先,"01"不是標準的十進制數值,沒法轉換成整型,因此"01"仍是一個字符串下標,那"0.1"呢?它固然也不是一個標準的十進制數值。這裏是違背了字符串轉型數字的強制類型轉換原則的,在變量的強制轉換中,這兩種字符串都會被轉換爲0,但在數組中則不會,這裏會是一個坑,也是須要注意的地方。數組

在PHP官方文檔中給出的Key值轉換說明以下:微信

  • 包含有合法整型值的字符串會被轉換爲整型。例如鍵名 "8" 實際會被儲存爲 8。可是 "08" 則不會強制轉換,由於其不是一個合法的十進制數值。
  • 浮點數也會被轉換爲整型,意味着其小數部分會被捨去。例如鍵名 8.7 實際會被儲存爲 8。
  • 布爾值也會被轉換成整型。即鍵名 true 實際會被儲存爲 1 而鍵名 false 會被儲存爲 0。
  • Null 會被轉換爲空字符串,即鍵名 null 實際會被儲存爲 ""。
  • 數組和對象不能被用爲鍵名。堅持這麼作會致使警告:Illegal offset type。

接下來,是筆者曾經作過的一道面試題,和這個類型轉換有着很是大的關係,代碼以下:學習

$a      = ['a'];
$a[2]   = 'b';
$a[]    = 'c';
$a['1'] = 'd';

// 如下循環的輸出結果是?
foreach ($a as $v) {
	echo $v, ',';
}

// 如下循環的輸出結果是?
for ($i = 0; $i < count($a); ++$i) {
	echo $a[$i], '  ,';
}

你們先不要運行,直接看代碼看看能不能看出這兩段代碼的輸出結果會是什麼,而後運行一下,看看結果和你想像的是否是同樣。測試

測試代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/201910/source/%E5%85%B3%E4%BA%8EPHP%E6%95%B0%E7%BB%84Key%E7%9A%84%E5%BC%BA%E5%88%B6%E8%BD%AC%E6%8D%A2.php.net

參考資料:
https://www.php.net/manual/zh/language.types.array.php

關注公衆號:【硬核項目經理】獲取最新文章code

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、項目管理學習資料

知乎、公衆號、抖音、頭條搜索【硬核項目經理】

B站ID:482780532

相關文章
相關標籤/搜索