PHPでarrayのキーが標準の整数表現の時、stringで設定しても自動的にintegerになる話
結論
PHPの仕様として、arrayのキーが数値として解釈できる場合、自動的にintegerになる!
引用元:https://www.php.net/manual/en/language.types.array.php
Strings containing valid decimal ints, unless the number is preceded by a + sign, will be cast to the int type. E.g. the key "8" will actually be stored under 8. On the other hand "08" will not be cast, as it isn't a valid decimal integer.
標準の整数表現: 配列のキーが標準の整数表現である場合、それは整数として解釈されます(例:"8"は8として解釈されるが、"08"は文字列のまま)。
実際に動かしてみた結果、確かにそうなってる(ちょっと気持ち悪い)
> $foo = [ "8" => "fizz", "08" => "buzz" ];
= [
8 => "fizz",
"08" => "buzz",
]
経緯
こんな感じの配列のフォームがあって
<form method="POST" action="/submit">
<input type="checkbox" name="foo[1]" value="fizz" checked>
<input type="checkbox" name="foo[2]" value="buzz" checked>
<button type="submit">Submit</button>
</form>
Laravel側でinput
関数を使って取得したとき
$foo = $request->input('foo');
レビュアー「この$foo
の値の配列のキーはinteger
?string
?どっち?場合によってはstringになったりしない?」
[ 1 => "fizz", 2 => "buzz" ]; // 基本はコレで取得できる
[ "1" => "fizz", "2" => "buzz" ] // こっちになるパターンってある?という質問
ワイ「値を確認したらキーはinteger型だけど... どういう仕様でそうなってるのか調べるか」
おまけ
2001年、PHPの公式フォーラムに「arrayのキーに数字のstringを使ったのにintegerになるバグがあるんやけど...」という質問があった。
引用元:https://bugs.php.net/bug.php?id=9307
Numeric-looking array keys are forced to be integers
公式からは「バグじゃないで、そういう仕様やで」という回答が。20年前か...
Right, this is how PHP works. That's not a bug, that's an
intended behaviour.
Discussion