2012-03-28 19 views
0

私は、明確に定義されておらず、変更の対象となるデータを渡しています(少なくとも、正式な仕様はなく、プロパティを追加/削除することもできます)。私はJSONとして受け取ったデータを制御できず、json_decodeを匿名オブジェクトにします。マルチレベルオブジェクト内の変数変数

データを理解するために、いくつかのマッピングを作成したいと思います。 、私は手でそれをやっていた場合はファーストネームが$Data->FirstNameで発見することができます意味するであろうと、現在の雇用者が$Data->Employer->CurrentEmployer

である私が好きな

$Data = json_decode($TheRawData); 

$Mappings->Personal['Firstname']="FirstName"; 
$Mappings->Personal['Employer']="Employment->CurrentEmployer"; 

:データを仮定すると、人、のようなものを定義します保守性のためにデータベース内のマッピングの情報を格納する。以下に示すように、私は定義されたプロパティのオブジェクトを解析しようとすると残念ながら、:

foreach($Mappings->Personal as $Key=>$Value) { 
    print $Key . ": " . $Data->{$Value};  
} 

(予想通り)ファーストネームは完璧に動作しますが、それは第二エントリのセレクタを好きではない、それが複数にまたがるだと思われるので、繰り返し検索が必要になります。

オブジェクト内の任意の場所にマップできる方法があるかどうかを誰かに教えてもらえますか?

+0

$プロフィールはどこから来たのですか?私は何かを逃したか? – Pete

+0

おかげでPete。私は今それを変更しました。 - 基本 – Pete

+1

@Pete - 謝罪、私はこのページをリフレッシュしていなかったので、あなたのコメントを見なかった - 私は間違いを見つけて修正した。よく目に付き、2回: – Basic

答えて

1

すばらしいGoogleが何も役に立たなかったので、もう少し反復的なものを提案する必要があります。

$Data = json_decode($TheRawData); 

$Mappings->Personal['Firstname']=array("FirstName"); 
$Mappings->Personal['Employer']=array("Employment","CurrentEmployer"); 

foreach($Mappings->Personal as $Key=>$Value) { 
    $Result = $Data; 
    foreach($Value as $PropertyName) { 
     $Result = $Result->$PropertyName; 
    } 
    print $Key . ": " . $Result;  
} 

私はこれをテストしていませんが、これらの行に沿って何かがうまくいくはずです。

+0

これは、ネスティングのレベルが1つしかないと仮定して動作します - 私は理想的に複数をサポートできるようにしたいと思います。私は再帰関数を使用して各レベルをステップすることができますが、非常に面倒です。 – Basic

+0

そうではありません。内側のループを注意深く見てください。 $ Resultが取り込まれ、要求されたプロパティを読み込み、それを$ Resultに代入して、あなたが望む再帰を提供します。 – Gleeb

+1

おはようございます、コメントが間違っていて、同じ朝のコードを間違って読んでしまった。それがうまくいくと思います、ありがとうございます。 – Basic