2

私の状況は非常に単純ですが、私はまだ素敵で短い解決策を探しています。これが私のケースです:

別の呼び出しとは異なる SOAP 応答オブジェクトを受け取りました。場合によっては、これらのプロパティ自体がオブジェクトであり、取得する必要のあるプロパティが含まれている場合があります。このために、必要なデータを選択して残りを破棄するために、呼び出しの種類ごとに配列が設定されます。

例として、呼び出しで次のようなオブジェクトを受け取ります: (受け取ったオブジェクトをモックすることで、コードを簡単にテストできるようにしました)

$objTest = new stdClass();
$objTest->Content1 = "";
$objTest->Content2 = new stdClass();
$objTest->Content2->prop1=1;
$objTest->Content2->prop2=2;
$objTest->Content2->prop3=3;
$objTest->Content3 = 3;
$objTest->Content4 = array('itm1'=>1, 'itm2'=>'two');

$objTest->Content2->prop3 が存在するかどうかを確認したいのですが、探しているものが連想配列にあるため、これを探しているタイミングがわかりません。

呼び出しの配列は次のようになります。

$map = array('Content3','Content2->prop3');

これからは、これを行うことで Content3 プロパティのコンテンツを取得できます。

foreach ($map as $name => $value) {
    if (isset($object->$name)) {
        echo "$value: ". json_encode($object->$name)."\n";
    }
}

しかし、参照「->」のため、他のものではありません。

今私の質問: 上に表示されているように、未知のオブジェクトの未知のプロパティを取得する方法はありますか?

これは、以前のテストの結果です。

objTests のダンプ:

オブジェクト (stdClass)[1]

public 'Content1' => string '' (length=0)

public 'Content2' => object(stdClass)[2]

    public 'prop1' => int 1

    public 'prop2' => int 2

    public 'prop3' => int 3

public 'Content3' => int 3

public 'Content4' => array (size=2)

    'itm1' => int 1

    'itm2' => string 'two' (length=3)

オブジェクトの content2 のプロパティ prop3 に文字列でアクセスしようとしています:

値を取得する標準的な方法: $objTest->Content2->prop3

結果 : 3

テスト文字列: "Content3"

結果: 3

テスト文字列: "Content2->prop3"

( ! ) 注意: 未定義のプロパティ: stdClass::$Content2->prop3

私の状況を理解するのに役立つことを願っています!

ありがとう!

4

1 に答える 1

1

これを行う組み込みのPHP関数は知りませんが、関数を使用してプロパティの文字列を分割し、それらを繰り返し処理して文字列の最後の値を見つけることができます。

function get_property($object, $prop_string, $delimiter = '->') {
    $prop_array = explode($delimiter, $prop_string);
    foreach ($prop_array as $property) {
        if (isset($object->{$property}))
            $object = $object->{$property};
        else
            return;
    }
    return $object;
}
于 2013-10-22T21:15:42.667 に答える