2

OOP でより多くのコードを書き始めて以来、私は常に「コード スタイリング」の問題に直面しています。既存のオブジェクトにデータを追加したいと考えています。配列を使用した場合、すべての配列項目が独自のキーを持っているため、これは foreach で簡単に可能でした。オブジェクトを使用すると、キーを使用して各アイテムにアクセスする方法が見つかりませんでした。

$data_items = $this->model->get_function();
$data_items = (array) $data_items;
foreach ($data_items as $key => $row)
{
      $data_items[$key]['additional_data'] = 'additional_data';                      
}
$data_items = (object) $data_items;

私のコードは回避策にすぎないと思います。コード行「$data_items = (array) $data_items;」を取り除くことができるかどうか、誰か教えてください。および「$data_items = (オブジェクト) $data_items;」。

私の質問に答えてくれたみんな、ありがとう!

今まで、私が達成しようとしたことがとても簡単であることに気づきませんでした:

foreach ($data_items as $row)
{
    $row->additional_data = 'additional_data';
}
4

4 に答える 4

2

オブジェクトと配列は、データ処理の観点からはほとんど同じように見えます。別のオブジェクトプロパティを追加して、そのプロパティを宣言することなくデータを保存することができます(私の意見では、これは欠点ですが、あなたの場合は利点です)。

配列:

$arr = array();
$arr['additional_data'] = 'foo';

物体:

$obj = new stdClass;
$obj->additional_data = 'bar';

Foreach は、配列キーを処理するのと同じようにオブジェクト プロパティを処理します。また、暗黙的なキャストは必要ありません。

キャストなしのバリアントは次のとおりです。

$data_items = $this->model->get_function();
foreach ($resource_contacts as $key => $row)
{
      // Note, $data_items->{$key} must be an object, or this will crash.
      // You can check if it is with is_object() and react accordingly
      $data_items->{$key}->additional_data = 'additional_data';                      
}
于 2013-07-09T13:51:23.213 に答える
0

次のようなことができるはずです。

$data_items = $this->model->get_function();
foreach ($resource_contacts as $key => $row)
{
      $data_items->$key->additional_data = 'additional_data';                      
}
于 2013-07-09T13:55:25.637 に答える
0

foreachそれが達成しようとしている場合は、参照を使用してループ内でオブジェクトを変更できるようにします。

foreach($objectList as &$obj){
    $obj->newProperty = 'whatever';
}
于 2013-07-09T13:58:50.307 に答える