2

我的情况很简单,但我仍在寻找一个不错的简短解决方案。这是我的情况:

我收到一个肥皂响应对象,它与对另一个对象的调用不同。有时,这些属性本身就是对象,并且可能具有我们必须获取的属性。为此,为每种类型的调用设置了一个数组,以选择所需的数据并丢弃其余数据。

例如,在一个调用中,我们收到一个像这样的对象:(我通过模拟接收到的对象使代码易于测试)

$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 回答