天天看點

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

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

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

$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"了?

沒錯,PHP中的數組Key值隻接受數字和字元串類型,當Key是字元串時,會強強制轉換為數字類型,遵守類型強制轉換的規則。浮點數也是同樣的道理,直接轉換成了向下取整的整型。

那麼"0.1"和"01"為什麼還在?首先,"01"不是标準的十進制數值,無法轉換成整型,是以"01"還是一個字元串下标,那"0.1"呢?它當然也不是一個标準的十進制數值。這裡是違背了字元串轉型數字的強制類型轉換原則的,在變量的強制轉換中,這兩種字元串都會被轉換為0,但在數組中則不會,這裡會是一個坑,也是需要注意的地方。

  • 包含有合法整型值的字元串會被轉換為整型。例如鍵名 "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], '  ,';
}