🗂️

PHPでarrayのキーが標準の整数表現の時、stringで設定しても自動的にintegerになる話

2024/05/22に公開

結論

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の値の配列のキーはintegerstring?どっち?場合によっては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