0

キャスト後の 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);
}

しかし、データ型を保存して (そして、前に示したように反復処理中にエントリの重複を避けて)、より美しい方法で作成するとよいでしょう。

4

2 に答える 2

1

PHPマニュアルから:

有効な整数を含む文字列は整数型にキャストされます。たとえば、キー "8" は実際には 8 の下に格納されます。一方、"08" は有効な 10 進整数ではないため、キャストされません。

于 2012-09-13T17:59:21.527 に答える
0

@cHao は、foreach() を使用せずにオブジェクトを配列に変換するためのクリーンで実用的なソリューションを見つけました。私の例は次のようになります:

$array = array();
$obj = new stdClass();
$obj->{'0'} = "test";
foreach ($obj as $key => $value) {
   $array[$key] = strtoupper($value);
}

stdClass は反復可能です。

ありがとうございました!

于 2012-09-13T18:43:19.710 に答える