PHP 陣列鍵名支援 int 與 string 兩種型別,但其隱性型別轉換規則(布林、浮點數、null)常導致難以除錯的邏輯錯誤。本文系統整理鍵名轉換機制、特殊值行為、[] 追加語法,並提供防錯最佳實踐。
PHP 在陣列鍵名存取時,會依下表自動轉換:
| 原始鍵名 | 實際儲存鍵名 | 說明 |
|---|---|---|
true | 1 | 布林真轉整數 1 |
false | 0 | 布林偽轉整數 0 |
null | '' (空字串) | 可用 $arr[''] 或 $arr[null] 存取 |
123.45 | 123 | 浮點數截取整數部份 |
'123' | 123 | 純數字字串轉整數 |
'0123' | '0123' | 前導零字串不轉換 |
<?php
$arr = [];
$arr[true] = 'a'; // $arr[1] = 'a'
$arr[false] = 'b'; // $arr[0] = 'b'
$arr[null] = 'c'; // $arr[''] = 'c'
$arr[123.9] = 'd'; // $arr[123] = 'd'
$arr['123'] = 'e'; // 覆蓋 $arr[123] = 'e'
$arr['0123'] = 'f'; // $arr['0123'] = 'f' (獨立鍵)
var_dump($arr);
/*
array(4) {
[0]=> 'b'
[1]=> 'a'
[123]=> 'e'
['0123']=> 'f'
['']=> 'c'
}
*/
?>
<?php
$arr = [0 => 'first', 1 => 'second'];
$arr[false] = 'override'; // 實際操作 $arr[0]
// $arr[0] 變為 'override'
?>
<?php
$key = 0.1 + 0.2; // 0.30000000000000004
$arr[$key] = 'value'; // 實際鍵名為 0
?>
<?php
$arr[null] = 'a';
$arr[''] = 'b'; // 覆蓋同一個位置
// 只有 $arr[''] 存在
?>
$arr[] = $value<?php
$arr = ['a' => 1, 5 => 2];
$arr[] = 3; // 索引 6
$arr[] = 4; // 索引 7
// 結果: ['a'=>1, 5=>2, 6=>3, 7=>4]
?>
<?php
$arr[123.45] = 'test';
foreach ($arr as $k => $v) {
var_dump($k); // int(123) 而非 float
}
?>
關鍵點:遍歷時鍵名為轉換後的型別(整數/字串)。
$arr['123']'true', 'false', 'empty'array_key_exists():isset() 對 null 值回傳 falsearray_keys() 檢查是否有非預期鍵名型別true/false/null/0/0.0/-0.0/'0'/'00'<?php
$arr1 = ['a' => 1];
$arr2 = [1 => 2, 'b' => 3];
$merged = [...$arr1, ...$arr2];
// ['a'=>1, 1=>2, 'b'=>3] 整數鍵名重新編排,字串鍵名保留
?>
深入理解 PHP 陣列鍵名的隱性轉換規則,能從根源上消除一類難以重現的 Bug。建立「鍵名即型別」的防衛性程式習慣,讓陣列操作更可預測、更易維護。