【问题标题】:How to convert an array into an object using stdClass() [duplicate]如何使用 stdClass() 将数组转换为对象 [重复]
【发布时间】:2013-10-09 12:27:33
【问题描述】:

我做了以下数组:

$clasa = array(
        'e1' => array('nume' => 'Nitu', 'prenume' => 'Andrei', 'sex' => 'm', 'varsta' => 23),
        'e2' => array('nume' => 'Nae', 'prenume' => 'Ionel', 'sex' => 'm', 'varsta' => 27),
        'e3' => array('nume' => 'Noman', 'prenume' => 'Alice', 'sex' => 'f', 'varsta' => 22),
        'e4' => array('nume' => 'Geangos', 'prenume' => 'Bogdan', 'sex' => 'm', 'varsta' => 23),
        'e5' => array('nume' => 'Vasile', 'prenume' => 'Mihai', 'sex' => 'm', 'varsta' => 25)
);

我想知道如何使用 stdClass() 将这个数组转换为对象,我是 PHP 初学者,一个简单的例子会很有帮助,我试过搜索类似的问题,但答案很复杂并超越我对基本类和对象的理解。

【问题讨论】:

    标签: php arrays stdclass


    【解决方案1】:

    您只需添加此代码

    $clasa = (object) array(
                'e1' => array('nume' => 'Nitu', 'prenume' => 'Andrei', 'sex' => 'm', 'varsta' => 23),
                'e2' => array('nume' => 'Nae', 'prenume' => 'Ionel', 'sex' => 'm', 'varsta' => 27),
                'e3' => array('nume' => 'Noman', 'prenume' => 'Alice', 'sex' => 'f', 'varsta' => 22),
                'e4' => array('nume' => 'Geangos', 'prenume' => 'Bogdan', 'sex' => 'm', 'varsta' => 23),
                'e5' => array('nume' => 'Vasile', 'prenume' => 'Mihai', 'sex' => 'm', 'varsta' => 25)
    );
    

    如果你想看看是不是这个 stdClass 对象,只需调用它

    print_r($clasa);
    

    如果要将数组转换为目标代码将是

    $arr = array('a'=>'apple','b'=>'ball');
    $arr = (object) $arr;
    

    您不需要使用 stdClass。它会自动转换为stdClass

    【讨论】:

    • 不适用于嵌套数组
    • 您必须对嵌套数组进行递归转换,请参阅下面的@darleys 答案
    • 对嵌套数组尝试这种方式:$class= (object) [ 'e1' => (object) ['num' => 'Nitu', 'sex' => 'm'], ' e2' => (object) ['num' => 'Nae', 'sex' => 'm'] ]
    【解决方案2】:

    快速而肮脏的方法是使用json_encodejson_decode 将整个数组(包括子元素)变成一个对象。

    $clasa = json_decode(json_encode($clasa)); //Turn it into an object
    

    同样可用于将对象转换为数组。只需将, true 添加到json_decode 即可返回关联数组:

    $clasa = json_decode(json_encode($clasa), true); //Turn it into an array
    

    另一种方式(不脏)是简单的递归函数:

    function convertToObject($array) {
        $object = new stdClass();
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $value = convertToObject($value);
            }
            $object->$key = $value;
        }
        return $object;
    }
    

    或完整代码:

    <?php
        function convertToObject($array) {
            $object = new stdClass();
            foreach ($array as $key => $value) {
                if (is_array($value)) {
                    $value = convertToObject($value);
                }
                $object->$key = $value;
            }
            return $object;
        }
    
        $clasa = array(
                'e1' => array('nume' => 'Nitu', 'prenume' => 'Andrei', 'sex' => 'm', 'varsta' => 23),
                'e2' => array('nume' => 'Nae', 'prenume' => 'Ionel', 'sex' => 'm', 'varsta' => 27),
                'e3' => array('nume' => 'Noman', 'prenume' => 'Alice', 'sex' => 'f', 'varsta' => 22),
                'e4' => array('nume' => 'Geangos', 'prenume' => 'Bogdan', 'sex' => 'm', 'varsta' => 23),
                'e5' => array('nume' => 'Vasile', 'prenume' => 'Mihai', 'sex' => 'm', 'varsta' => 25)
        );
    
        $obj = convertToObject($clasa);
        print_r($obj);
    ?>
    

    哪个输出(注意没有数组 - 只有stdClass's):

    stdClass Object
    (
        [e1] => stdClass Object
            (
                [nume] => Nitu
                [prenume] => Andrei
                [sex] => m
                [varsta] => 23
            )
    
        [e2] => stdClass Object
            (
                [nume] => Nae
                [prenume] => Ionel
                [sex] => m
                [varsta] => 27
            )
    
        [e3] => stdClass Object
            (
                [nume] => Noman
                [prenume] => Alice
                [sex] => f
                [varsta] => 22
            )
    
        [e4] => stdClass Object
            (
                [nume] => Geangos
                [prenume] => Bogdan
                [sex] => m
                [varsta] => 23
            )
    
        [e5] => stdClass Object
            (
                [nume] => Vasile
                [prenume] => Mihai
                [sex] => m
                [varsta] => 25
            )
    
    )
    

    所以你可以通过$obj-&gt;e5-&gt;nume来引用它。

    DEMO

    【讨论】:

    • 已经是数组了,为什么还要再转变成数组呢?
    • 太棒了,但从我读过的内容来看,这个解决方案的执行速度或多或少会慢一些。
    • @AmalMurali 这是为了补充一点,这可以用来转换array -&gt; objectobject -&gt; array。再读一遍帖子:同样可以用来把对象转成数组.
    • @Alexandrw 这是真的。或者,您可以检查我的编辑以获取非脏解决方案。
    • 这个解决方案json_decode(json_encode($clasa)) 与仅使用(object) 将数组转换为对象相比的好处是后者不会递归地执行此操作,因此任何内部数组仍然是数组。
    【解决方案3】:

    最简单的解决方案之一是

    $objectData = (object) $arrayData
    

    【讨论】:

    • 不适用于嵌套数组。它们仍然是数组,而不是 stdClass
    【解决方案4】:

    如果您想将整个数组递归地转换为 Object 类型(stdClass),那么下面是最好的方法,并且它不耗时或内存不足,特别是当您想要进行递归(多级)转换时编写自己的函数。

    $array_object = json_decode(json_encode($array));
    

    【讨论】:

    • 看起来还没有转换所有数组
    【解决方案5】:

    要使用 stdClass 将数组转换为对象,只需将 (object) 添加到您声明的数组中。

    前:

    echo $array['value'];
    echo $object->value;
    

    将对象转换为数组

    $obj = (object)$array;
    

    将数组转换为对象

    $arr = (array)$object
    

    使用这些方法,您可以非常轻松地在数组和对象之间进行交换。


    另一种方法是使用json

    $object = json_decode(json_encode($array), FALSE);
    

    但这是一种更占用内存的方式,并且不受 PHP 版本的支持

    【讨论】:

      【解决方案6】:

      使用这个Tutorial

      <?php
      function objectToArray($d) {
              if (is_object($d)) {
                  // Gets the properties of the given object
                  // with get_object_vars function
                  $d = get_object_vars($d);
              }
      
              if (is_array($d)) {
                  /*
                  * Return array converted to object
                  * Using __FUNCTION__ (Magic constant)
                  * for recursive call
                  */
                  return array_map(__FUNCTION__, $d);
              }
              else {
                  // Return array
                  return $d;
              }
          }
      
          function arrayToObject($d) {
              if (is_array($d)) {
                  /*
                  * Return array converted to object
                  * Using __FUNCTION__ (Magic constant)
                  * for recursive call
                  */
                  return (object) array_map(__FUNCTION__, $d);
              }
              else {
                  // Return object
                  return $d;
              }
          }
      
              // Create new stdClass Object
          $init = new stdClass;
      
          // Add some test data
          $init->foo = "Test data";
          $init->bar = new stdClass;
          $init->bar->baaz = "Testing";
          $init->bar->fooz = new stdClass;
          $init->bar->fooz->baz = "Testing again";
          $init->foox = "Just test";
      
          // Convert array to object and then object back to array
          $array = objectToArray($init);
          $object = arrayToObject($array);
      
          // Print objects and array
          print_r($init);
          echo "\n";
          print_r($array);
          echo "\n";
          print_r($object);
      
      
      //OUTPUT
          stdClass Object
      (
          [foo] => Test data
          [bar] => stdClass Object
              (
                  [baaz] => Testing
                  [fooz] => stdClass Object
                      (
                          [baz] => Testing again
                      )
      
              )
      
          [foox] => Just test
      )
      
      Array
      (
          [foo] => Test data
          [bar] => Array
              (
                  [baaz] => Testing
                  [fooz] => Array
                      (
                          [baz] => Testing again
                      )
      
              )
      
          [foox] => Just test
      )
      
      stdClass Object
      (
          [foo] => Test data
          [bar] => stdClass Object
              (
                  [baaz] => Testing
                  [fooz] => stdClass Object
                      (
                          [baz] => Testing again
                      )
      
              )
      
          [foox] => Just test
      )
      

      【讨论】:

        【解决方案7】:

        数组到 stdClass 可以通过这种方式在 php 中完成。 (stdClass 已经是 PHP 的通用空类了)

        $a = stdClass:: __set_state(array());
        

        实际上在 PHP 5 中调用 stdClass::__set_state() 会产生致命错误。感谢@Ozzy 指出

        这是一个示例,说明如何在 PHP5 中将 __set_state() 与 stdClass 对象一起使用

        class stdClassHelper{
        
            public static function __set_state(array $array){
                $stdClass = new stdClass();
                foreach ($array as $key => $value){
                   $stdClass->$key = $value;
                }
                return $stdClass;
            }
        }
        
        $newstd = stdClassHelper::__set_state(array());
        

        或者更好的方式。

        $a = (object) array();
        

        【讨论】:

        • 不适用于嵌套数组
        【解决方案8】:

        或者你可以使用这个东西

        $arr = [1,2,3];
        $obj = json_decode(json_encode($arr));
        print_r($obj);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-09
          • 2016-12-25
          • 1970-01-01
          • 2011-11-08
          • 1970-01-01
          • 2021-09-29
          • 2018-09-12
          相关资源
          最近更新 更多