キャスト後の PHP の奇妙な動作に行き詰まります。コードは次のとおりです。
$obj = new stdClass();
$obj->{'0'} = "test";
$array = (array)$obj;
var_dump($array);
このコードは以下を出力します:
array(1) { ["0"]=> string(4) "test" }
絶対に正常です。
次に、いくつかのコードを追加します。
foreach ($array as $key => $value) {
$array[$key] = strtoupper($value);
}
var_dump($array);
このコードは次を出力します。
array(2) {
["0"]=>
string(4) "test"
[0]=>
string(4) "TEST"
}
$key が int にキャストされるのはなぜですか?
もっと簡単な例を試してみると:
$array = array("0" => "test");
foreach ($array as $key => $value) {
$array[$key] = strtoupper($value);
}
var_dump($array);
これは出力します:
array(1) { [0]=> string(4) "TEST" }
$key から int へのキャストがある理由を誰かが知っていますか?
アップデート
キーを強制的に文字列にキャストしようとしました:
$array["{$key}"] = $value;
と
$array[(string)$key] = $value;
しかし、それらは int として挿入されます。したがって、私の質問は次のとおりです。キーを文字列として配列に挿入する方法はありますか?
私は、2 番目の配列を使用して文字列を無視することで問題を解決できることを知っています。
$obj = new stdClass();
$obj->{'0'} = "test";
$array = (array)$obj;
$array2 = array();
foreach ($array as $key => $value) {
$array2[$key] = strtoupper($value);
}
しかし、データ型を保存して (そして、前に示したように反復処理中にエントリの重複を避けて)、より美しい方法で作成するとよいでしょう。