如何使用变量设置对象中任何属性的值?

时间:2018-02-20 15:39:40

标签: php properties stdclass

我有一个不同深度的物体。


stdClass Object
(
    [1] => stdClass Object
        (
            [color] => green 
        )
    [9] => stdClass Object
        (
            [optgroup] => stdClass Object
                (
                    [4] => stdClass Object
                        (
                            [OPTION] => 
                        )
                    [5] => stdClass Object
                        (
                            [OPTION] => stdClass Object
                                (                            
                                    [2] => stdClass Object
                                        (
                                            [DataSubtext] => SUBTEXT of
                                        )
                                    [3] => stdClass Object
                                        (
                                            [DataIcon] => glyphicon-heart
                                        )
                                )
                        )
                )
        )
)

我想在html页面中编辑此对象的数据,并且需要在单击后访问特定属性。但我事先并不知道深度,即“颜色”。是2级但是#OPOP'是6级。 当我用路径创建一个字符串时(例如$ string =' {9} - > optgroup - > {2} - > OPTION - > {2} - > THEOPT')和

后添加

$var = $myobject -> $string ;

我必须使用eval来获取和设置属性,但应该避免这种情况。 我考虑过每个级别的案例......,

switch ($depth) ...
case 1...
case 2...

那么如何以最佳方式使用变量处理任何属性? 我想出了这个解决方案。它是一个递归函数,返回我需要的三个属性。该数组是作为数组的属性,即9,optgroup,2等

我想知道php没有提供一个简单的界面来精确编辑对象。

    function getObjectValue ( $object, $array ){
  if ( $array[1] == ''  )  {
     $f = new stdClass;
     $f -> POS  =  $array[0];
     foreach( $object -> {$array[0]} as $key  => $value ) {
         $f -> name = $key;
         $f -> value = $value;
    }
  return $f ;}
 if (  is_object(  $object -> {$array[0]} )   ){
     $next = array_shift($array) ;
     $result = getObjectValue(  $object -> {$next} ,  $array );
     }
  return $result;
 }

1 个答案:

答案 0 :(得分:0)

我不知道这是否可以解决你的问题,无论如何

$array = json_decode(json_encode($your_std_class_object), true);

这将以数组格式获取对象,因此通过使用数组,您可以简单地迭代,并检查它是否有一个子节点,并找出数组的深度。