1. 程式人生 > >PHP陣列關於數字鍵名的問題

PHP陣列關於數字鍵名的問題

以下是對PHP陣列數字鍵名的幾點總結:

鍵名長度只能在 int 長度範圍內,超過int 範圍後將會出現覆蓋等混亂情況

在鍵名長度為 int 範圍內存取值時,PHP會強制將數字鍵名轉換為 int 數值型

數字鍵名長度大於19位時,將變成 0

鍵名正常長度時,字串或數值型別一樣

$i = 126545165;
$arr['126545165'] = 'abc';
$arr[126545165] = 'uio';
var_dump($arr);
echo '<br>';
var_dump(isset($arr[$i]));


長度超過整型時,鍵名混亂

$i = 12312312312312;
$arr['1000000000147483649'] = 'abc';
$arr[1000000000147483649] = 'uio';
var_dump($arr);
echo '<br>';
var_dump(isset($arr[$i]));




長度超過20位時,鍵名將變成 0

$i = 123123123123123123123123123123;
var_dump($i);
echo '<br>';
$arr[123123123123123123123123123123] = 'abc';
$arr[strval(123123123123123123123123123123)] = 'abc';
var_dump($arr);
echo '<br>';
var_dump(isset($arr[$i]));
echo '<br>';
var_dump(isset($arr[strval($i)]));
echo '<br>';
var_dump(array_keys($arr));


將變數直接作為鍵名存取,結果又有不同

$i = 123123123123123;
var_dump($i);
echo '<br>';
$arr[$i] = 'abc';
$arr[strval($i)] = 'abc';
var_dump($arr);
echo '<br>';
var_dump(isset($arr[$i]));
echo '<br>';
var_dump(isset($arr[strval($i)]));
echo '<br>';
var_dump(array_keys($arr));


從上面的幾種測試來看:

如果鍵名為數字,且範圍在 int 以內,字串或者 int 不會對存取有什麼影響

如果長度大於 int 時會自動轉化為 float ,再轉換進行存取出現各種混亂情況,甚至直接變成 0,所以最好是統一轉換為 string 型別

$i = 123123123123123123123123123123;
$j = '123123123123123123123123123123';
$arr1[strval($i)] = 'abc';
$arr2[$j] = 'abc';
var_dump($arr1);
echo '<br>';
var_dump($arr2);


所以在動態操作 PHP 陣列時,如果不能確定鍵名是否會出現數字或者長度大於 int ,則統一將鍵名 strval 轉換為 字串來操作最為穩妥