2016-06-19 3 views
0

に多次元配列データを適用$obj(CouchDBのからロードされた)所定のPHPオブジェクトのオブジェクト

class stdClass#1 (3) { 
    public $_id => 
    string(10) "nochecksum" 
    public $_rev => 
    string(34) "1-4f734a24465bf7ba2de316fe87ffa0c1" 
    public $rooms => 
    class stdClass#2 (1) { 
     public $kitchen => 
     class stdClass#3 (1) { 
      public $ceilingFan => 
      bool(false) 
     } 
    } 
} 

およびデータ$arrの所定の多次元配列、プロパティの変更または新しい値からなるため

array(1) { 
    'rooms' => 
    array(1) { 
     'kitchen' => 
     array(1) { 
      'needsCleaning' => 
      bool(true) 
     } 
    } 
} 

$objのプロパティを$arrの値に設定するにはどうすればよいですか?

ソリューションは、1次元配列のために簡単です:

foreach ($arr as $k=>$v) { 
    $obj->{$k}=$v; 
} 

私は再帰関数を試してみましたが、私は親(複数可)を参照する方法がわからない:

$obj = setObjectFromArray($obj, $arr); 

function setObjectFromArray($obj, $arr, $tree=Array()) 
{ 
    foreach ($arr as $k=>$v) { 
     if (is_array($v)) { 
      $tree[]=$k; 
      $obj = setObjectFromArray($obj, $v, $tree); 
     } else { 
      // Here $tree is Array('rooms','kitchen') 
      // I want to set $obj->rooms->kitchen->{$k} 
     } 
    } 
    return $obj; 
} 

私は、オブジェクトのプロパティのリファレンスを再帰関数に渡すとうまくいくかもしれないと思っていますが、私は教育的な推測をするには十分理解していません。

$r = array(
    'rooms' => array(
     'kitchen' => array(
      'needsCleaning' => true 
     ) 
    ) 
); 

echo '<pre>',print_r(json_decode(json_encode($r))), '</pre>'; 

説明:あなたはJSON文字列に配列をコード化して、この文字列をデコードし、それは、json関数のペアだ - すべてのヘルプは、このソリューションは完全に明白ではない、多分どこかが、まだ失敗する可能性が

答えて

1

あなたはこのようにそれを行うことができます:

function setObjectFromArray($obj, $arr) { 
    foreach ($arr as $k => $v) { 
     $obj->{$k} = is_array($v) ? setObjectFromArray($obj->{$k}, $v) : $v; 
    } 
    return $obj; 
} 

あなたのコードとの大きな違いは$obj->{$k}代わりの$objへの割り当てである:あなたが書き換え(または作成)そのように再帰ツリーの各レベルのプロパティ。

$result = setObjectFromArray($obj, $arr); 

... $objはまだ修正されているだろうと$resultに等しいこと:

は、あなたがこのような関数を呼び出す場合でも、あることに注意してください。

0

を高く評価しました物申す。

多分、このコードをさらに展開することができます。

関連する問題