普段は連想配列派なのですが、既存のコードを触っていると StdClass のオブジェクトに遭遇することが時々あります。
それ自体は問題ないのですが、プロパティ(メンバー変数)が連番になっていたりするとループして初期化したくなります。
でも StdClass のプロパティって動的に扱うことができたっけ?っとよく忘れるので備忘録。
連想配列の場合
name_1 から name_5 の 5 つの値を例に考えてみましょう。
name_1 や name_2 には数値が入り、0 で初期化しておきたいと仮定します。
1 2 3 4 5 | name_1 => 0; name_2 => 0; name_3 => 0; name_4 => 0; name_5 => 0; |
連想配列のループならキー名さえ動的に扱えればいいので以下のように定義できます。
1 2 3 4 5 6 7 8 9 10 11 12 | $list = []; for ($i = 1; $i <= 5; $i++) { $list['name_' . $i] = 0; } $list = []; for ($i = 1; $i <= 5; $i++) { $list["name_$i"] = 0; } $list = []; for ($i = 1; $i <= 5; $i++) { $list["name_{$i}"] = 0; } |
キーの定義の仕方は人それぞれなので、自分のお気に入りの書き方か、プロジェクトの既存ソースに合わせておくといいでしょう。
結果はいずれも下の通りです。
1 2 3 4 5 6 7 8 | Array ( [name_1] => 0 [name_2] => 0 [name_3] => 0 [name_4] => 0 [name_5] => 0 ) |
StdClassの場合
StdClass の場合も以下のようにできるかな?やってみます。
1 2 3 4 | $list = new StdClass; for ($i = 1; $i <= 5; $i++) { $list->name_{$i} = 0; } |
これだと下のような結果になってしまいます。
1 2 3 4 5 6 7 8 9 10 11 | stdClass Object ( [name_] => Array ( 1 => 0 2 => 0 3 => 0 4 => 0 5 => 0 ) ) |
StdClass の場合はプロパティ全体を {} で囲む必要があります。
1 2 3 4 | $list = new StdClass; for ($i = 1; $i <= 5; $i++) { $list->{'name_' . $i} = 0; } |
このように定義すれば思った通りの結果になります。
1 2 3 4 5 6 7 8 | stdClass Object ( [name_1] => 0 [name_2] => 0 [name_3] => 0 [name_4] => 0 [name_5] => 0 ) |