如何在PHP中将数组转换为对象?

How to convert an array to object in PHP?

提问人:streetparade 提问时间:12/9/2009 最后编辑:matronatorstreetparade 更新时间:7/4/2023 访问量:1104098

问:

如何将这样的数组转换为对象?

[128] => Array
    (
        [status] => "Figure A.
 Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution."
    )

[129] => Array
    (
        [status] => "The other day at work, I had some spare time"
    )
PHP 数组对象 转换

评论

4赞 Pascal MARTIN 12/9/2009
确切地说,您想获得什么样的对象?我的意思是:属性应该是什么?
0赞 streetparade 12/9/2009
在循环中,它应该两者都存在,因为 status 是一个数据数组,所以两者都是 printet
3赞 11/5/2016
不确定从什么时候开始,但这只是有效:$a = (object)['hello' => 'world'];

答:

166赞 johannes 12/9/2009 #1

简单的方法是

$object = (object)$array;

但这不是你想要的。如果你想要对象,你想实现一些东西,但这个问题中缺少这一点。仅仅为了使用对象而使用对象是没有意义的。

评论

2赞 streetparade 12/9/2009
不起作用,我在问这个问题之前就这样做了,所以一定有另一种方法可以做到这一点
30赞 zombat 12/9/2009
为什么他必须给出想要使用物体的理由?我认为这与它是如何完成的无关的。也许他需要json_encode它们,或者将它们序列化?这样做可能有几十个原因。
0赞 streetparade 12/9/2009
嗯。。我查看了浏览器输出,它看起来像这样 object(stdClass)#150 (130) { [0]=> array(1) { [“status”]=> string(130) “终于,Mac 和 Linux 用户不必觉得自己是 Chrome 领域的二等公民:他们有官方的 beta 版本......” }正式的,这是一个对象,但如何迭代抛出这个,我可以访问像$obj->状态这样的状态,有什么想法吗?
0赞 johannes 12/9/2009
zombat,JSON编码不是使用对象的理由,有一个标志可以json_encode()来使用对象。使用 Serialize,需要接收器预期的特定对象类型。总的来说,我试图帮助解决实际问题。对我来说,这个问题意味着其他地方存在架构错误。
1赞 senecaTheMeek 12/15/2022
老话题,但我有时使用对象只是因为我更喜欢$o->的东西而不是$a[“东西”]
803赞 jlb 12/9/2009 #2

在最简单的情况下,将数组“强制转换”为对象可能就足够了:

$object = (object) $array;

另一种选择是将标准类实例化为变量,并在重新赋值时遍历数组:

$object = new stdClass();
foreach ($array as $key => $value)
{
    $object->$key = $value;
}

正如 Edson Medina 所指出的,一个真正干净的解决方案是使用内置函数:json_

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

这也(递归地)将所有子数组转换为您可能想要也可能不需要的对象。不幸的是,与循环方法相比,它的性能下降了 2-3 倍。

警告!(感谢 Ultra 的评论):

json_decode 在不同的环境中以不同的方式转换 UTF-8 数据。我最终在本地获得了“240.00”的值,在生产中获得了“240”的值 - 巨大的失望。如果转换失败,则字符串 get 返回为 NULL

评论

46赞 chelmertz 12/10/2009
“由于变量不能以数字开头”,是的,它们可以:$object->{3} = 'xyz';
13赞 feeela 5/13/2013
“性能达到 2-3 倍” 这是一个不公平的比较,因为后一种方法返回递归对象,而没有进一步条件的循环方法(如@streetparade的答案)只转换第一级。
10赞 jlb 5/13/2013
@feeela我不认为这不公平。我确实提到过它以递归方式进行转换。此外,使用平面输入数组(不使用任何递归)可以达到 2-3 倍的性能目标
9赞 Szymon Toda 11/5/2014
警告!json_decode 在不同的环境中以不同的方式转换 UTF-8 数据。我最终在本地获得了“240.00”的值,在生产中获得了“240”的值 - 巨大的失望。如果转换失败,则字符串 get 返回为 NULL
2赞 The Coprolal 12/13/2018
请注意,使用 json_* 函数时:在这种情况下,存储在原始数组中的引用(例如对其他数组的引用)将被复制。假设数组中的键包含对另一个数组的引用。然后,在执行后,您的单行代码将是 的副本,不再是对原始数组的引用。这在某些应用程序中可能是无害的,但对于大型数组,它会浪费内存,并且如果以后使用引用,可能会弄乱执行。x$object->x$array['x']
20赞 zombat 12/9/2009 #3

据我所知,没有内置的方法可以做到这一点,但它就像一个简单的循环一样简单:

    $obj= new stdClass();

    foreach ($array as $k=> $v) {
        $obj->{$k} = $v;
    }

如果需要它以递归方式构建对象,可以对此进行阐述。

1赞 Dooltaz 12/9/2009 #4

CakePHP 有一个递归的 Set::map 类,它基本上将数组映射到一个对象中。您可能需要更改数组的外观,以使对象看起来像您想要的样子。

http://api.cakephp.org/view_source/set/#line-158

最坏的情况是,你可能会从这个函数中得到一些想法。

106赞 Julius F 12/9/2009 #5

这里有三种方法:

  1. 伪造真实物体:

    class convert
    {
        public $varible;
    
        public function __construct($array)
        {
            $this = $array;
        }
    
        public static function toObject($array)
        {
            $array = new convert($array);
            return $array;
        }
    }
    
  2. 通过将数组转换为对象来将数组转换为对象:

    $array = array(
        // ...
    );
    $object = (object) $array;
    
  3. 手动将数组转换为对象:

    $object = object;
    foreach ($arr as $key => $value) {
        $object->{$key} = $value;
    }
    

评论

2赞 streetparade 12/9/2009
嗯,谢谢,但您的脸类给出以下错误 致命错误:无法在第 10 行的 /var/www/bot/inc/twitter-bot.php 中重新分配$this
1赞 streetparade 12/9/2009
而且 typcasint @ reference 不是一个好主意,即使它在这里不起作用,这是我得到的意想不到的T_OBJECT_CAST,期望T_NEW或T_STRING或T_VARIABLE或“$”
2赞 mate64 12/31/2011
$array =& (对象) $array == 不错的 KISS 实现!
17赞 Yogu 2/28/2014
为什么有人想使用与 2) 不同的方法?有什么缺点吗?
9赞 MinhajulAnwar 11/23/2015
将数组类型转换为对象不适用于嵌套数组
24赞 streetparade 12/9/2009 #6

这个对我有用

  function array_to_obj($array, &$obj)
  {
    foreach ($array as $key => $value)
    {
      if (is_array($value))
      {
      $obj->$key = new stdClass();
      array_to_obj($value, $obj->$key);
      }
      else
      {
        $obj->$key = $value;
      }
    }
  return $obj;
  }

function arrayToObject($array)
{
 $object= new stdClass();
 return array_to_obj($array,$object);
}

用法:

$myobject = arrayToObject($array);
print_r($myobject);

返回:

    [127] => stdClass Object
        (
            [status] => Have you ever created a really great looking website design
        )

    [128] => stdClass Object
        (
            [status] => Figure A.
 Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
        )

    [129] => stdClass Object
        (
            [status] => The other day at work, I had some spare time
        )

像往常一样,你可以像这样循环它:

foreach($myobject as $obj)
{
  echo $obj->status;
}

评论

0赞 xZero 7/13/2017
但是这个比类型转换慢 500% 左右(测试):$obj = (对象)$array;
1赞 Jeff Puckett 11/22/2017
@xZero但不适用于多维数组。$obj = (object) $array;
11赞 Nezzy 5/11/2011 #7

实际上,如果你想将它与多维数组一起使用,你会想要使用一些递归。

static public function array_to_object(array $array)
{
    foreach($array as $key => $value)
    {
        if(is_array($value))
        {
            $array[$key] = self::array_to_object($value);
        }
    }
    return (object)$array;
}
126赞 Edson Medina 3/28/2012 #8

快速破解:

// assuming $var is a multidimensional array
$obj = json_decode (json_encode ($var), FALSE);

不漂亮,但有效。

评论

2赞 aknatn 5/27/2012
我真的很喜欢这个解决方案,使用内置函数而不是用户定义的函数总是更快,而且这个效果很好。谢谢你的提示。
1赞 DeaconDesperado 6/20/2013
@Oddant,为了公平起见,@EdsonMedina,最初的问题没有指定属性需要什么可见性,并且由于 OP 在后面的注释中没有作为访问器使用,因此严重暗示他/她希望实例作为输出,而不是用户定义的类,例如您的答案使用。我同意这个解决方案的优雅,但不幸的是,这是一种非常常用的模式,用于解决嵌套数组的这个问题,其中强制转换为对象不起作用。OP 也有可能使用需要 and 对象作为输入而不是数组的接口。$thisstdClass
3赞 Denis Pshenov 11/5/2014
不要忘记,使用这种方式,您将失去除基本类型之外的所有类型。例如,DateTime 将是转换器 stdObject。
1赞 John Doe 6/28/2018
刚刚注意到,这不适用于这样的简单数组: json_decode(json_encode(['test']),false);这给出了与用于输入相同的数组
1赞 Edson Medina 6/30/2018
@JohnDoe问题指的是关联数组,而不是简单的数组。
2赞 Ben D 5/13/2012 #9

显然只是对其他人答案的推断,但这里有一个递归函数,它将任何覆盖维数组转换为一个对象:

   function convert_array_to_object($array){
      $obj= new stdClass();
      foreach ($array as $k=> $v) {
         if (is_array($v)){
            $v = convert_array_to_object($v);   
         }
         $obj->{strtolower($k)} = $v;
      }
      return $obj;
   }

请记住,如果数组具有数字键,它们仍然可以在结果对象中使用(例如:{}$obj->prop->{4}->prop)

1赞 celsowm 7/31/2012 #10

受到所有这些代码的启发,我尝试创建一个增强版本,支持:特定的类名,避免构造函数方法,“豆”模式和严格模式(仅设置现有属性):

    class Util {

static function arrayToObject($array, $class = 'stdClass', $strict = false) {
        if (!is_array($array)) {
            return $array;
        }

        //create an instance of an class without calling class's constructor
        $object = unserialize(
                sprintf(
                        'O:%d:"%s":0:{}', strlen($class), $class
                )
        );

        if (is_array($array) && count($array) > 0) {
            foreach ($array as $name => $value) {
                $name = strtolower(trim($name));
                if (!empty($name)) {

                    if(method_exists($object, 'set'.$name)){
                        $object->{'set'.$name}(Util::arrayToObject($value));
                    }else{
                        if(($strict)){

                            if(property_exists($class, $name)){

                                $object->$name = Util::arrayToObject($value); 

                            }

                        }else{
                            $object->$name = Util::arrayToObject($value); 
                        }

                    }

                }
            }
            return $object;
        } else {
            return FALSE;
        }
        }
}
4赞 fedmich 12/14/2012 #11

您也可以通过在变量左侧添加 (object) 来创建一个新对象来做到这一点。

<?php
$a = Array
    ( 'status' => " text" );
var_dump($a);
$b = (object)$a;
var_dump($b);
var_dump($b->status);

http://codepad.org/9YmD1KsU

评论

1赞 Pete 7/13/2013
也许值得一提的是,这被称为“强制转换”或“类型强制转换”:php.net/manual/en/... (object)array() 的行为记录在这里: php.net/manual/en/...
5赞 Eduardo Cuomo 5/8/2013 #12

容易:

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

例:

$array = array(
    'key' => array(
        'k' => 'value',
    ),
    'group' => array('a', 'b', 'c')
);

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

然后,以下情况为真:

$object->key->k === 'value';
$object->group === array('a', 'b', 'c')

评论

1赞 Julian 5/29/2015
我认为这是一种解决方法。为什么要将数组编码为 json,然后对其进行解码?这对我来说不是一个最佳决定。
1赞 Sz. 7/27/2015
@Julian,因为它是递归的,所以以正确定义和足够可靠(“标准”)的方式进行,而且速度也足够快,可以很好地替代随机的手工编码的猴子魔法。
10赞 vdegenne 5/25/2013 #13

我肯定会采用这样的干净方式:

<?php

class Person {

  private $name;
  private $age;
  private $sexe;

  function __construct ($payload)
  {
     if (is_array($payload))
          $this->from_array($payload);
  }


  public function from_array($array)
  {
     foreach(get_object_vars($this) as $attrName => $attrValue)
        $this->{$attrName} = $array[$attrName];
  }

  public function say_hi ()
  {
     print "hi my name is {$this->name}";
  }
}

print_r($_POST);
$mike = new Person($_POST);
$mike->say_hi();

?>

如果您提交:

formulaire

你会得到这个:

mike

我发现这更合乎逻辑,比较上述来自对象的答案应该用于它们的目的(封装可爱的小对象)。

此外,使用 get_object_vars 确保在操作的对象中没有创建额外的属性(您不希望汽车有姓氏,也不希望一个人有 4 个轮子)。

评论

0赞 Sakkeer Hussain 4/9/2015
为什么不使用 $attr_value 而不是 $array[$attr_name];在 yourpublic 函数中from_array($array) 函数
25赞 hakre 7/13/2013 #14

根据您需要的位置以及如何访问对象,有不同的方法可以做到这一点。

例如:只需对它进行类型转换

$object =  (object) $yourArray;

但是,最兼容的方法是使用实用程序方法(还不是PHP的一部分),该方法基于指定类型的字符串实现标准PHP转换(或者忽略它,仅取消引用值):

/**
 * dereference a value and optionally setting its type
 *
 * @param mixed $mixed
 * @param null  $type (optional)
 *
 * @return mixed $mixed set as $type
 */
function rettype($mixed, $type = NULL) {
    $type === NULL || settype($mixed, $type);
    return $mixed;
}

您的案例中的使用示例(在线演示):

$yourArray = Array('status' => 'Figure A. ...');

echo rettype($yourArray, 'object')->status; // prints "Figure A. ..."
0赞 Muhammad 8/2/2013 #15

我用非常简单的方法做到了,

    $list_years         = array();
    $object             = new stdClass();

    $object->year_id   = 1 ;
    $object->year_name = 2001 ;
    $list_years[]       = $object;
180赞 Shahbaz 9/17/2013 #16

您可以简单地使用类型转换将数组转换为对象。

// *convert array to object* Array([id]=> 321313[username]=>shahbaz)
$object = (object) $array_name;

//now it is converted to object and you can access it.
echo $object->username;
0赞 Mehmet Ali Ulusan 4/29/2014 #17
function object_to_array($data)
{
    if (is_array($data) || is_object($data))
    {
        $result = array();
        foreach ($data as $key => $value)
        {
            $result[$key] = object_to_array($value);
        }
        return $result;
    }
    return $data;
}

function array_to_object($data)
{
    if (is_array($data) || is_object($data))
    {
        $result= new stdClass();
        foreach ($data as $key => $value)
        {
            $result->$key = array_to_object($value);
        }
        return $result;
    }
    return $data;
}
8赞 slevy1 10/13/2014 #18

您还可以使用 ArrayObject,例如:

<?php
    $arr = array("test",
                 array("one"=>1,"two"=>2,"three"=>3), 
                 array("one"=>1,"two"=>2,"three"=>3)
           );
    $o = new ArrayObject($arr);
    echo $o->offsetGet(2)["two"],"\n";
    foreach ($o as $key=>$val){
        if (is_array($val)) {
            foreach($val as $k => $v) {
               echo $k . ' => ' . $v,"\n";
            }
        }
        else
        {
               echo $val,"\n";
        }
    }
?>

//Output:
  2
  test
  one => 1
  two => 2
  three => 3
  one => 1
  two => 2
  three => 3

评论

1赞 Julian 5/29/2015
在我看来,这应该成为最好的答案。更多信息 herre: php.net/manual/en/arrayobject.construct.php
0赞 VishnuPrasad 12/30/2014 #19

通过使用 (array) 和 (object) 作为前缀,您可以简单地将对象数组转换为标准数组和反之词

<?php
//defining an array
$a = array('a'=>'1','b'=>'2','c'=>'3','d'=>'4');

//defining an object array
$obj = new stdClass();
$obj->a = '1';
$obj->b = '2';
$obj->c = '3';
$obj->d = '4';

print_r($a);echo '<br>';
print_r($obj);echo '<br>';

//converting object array to array
$b = (array) $obj;
print_r($b);echo '<br>';

//converting array to object
$c = (object) $a;
print_r($c);echo '<br>';
?>
1赞 acelot 7/27/2015 #20

法典

此函数的工作原理与 相同。json_decode(json_encode($arr), false)

function arrayToObject(array $arr)
{
    $flat = array_keys($arr) === range(0, count($arr) - 1);
    $out = $flat ? [] : new \stdClass();

    foreach ($arr as $key => $value) {
        $temp = is_array($value) ? $this->arrayToObject($value) : $value;

        if ($flat) {
            $out[] = $temp;
        } else {
            $out->{$key} = $temp;
        }
    }

    return $out;
}

测试

测试 1:平面阵列

$arr = ["a", "b", "c"];
var_export(json_decode(json_encode($arr)));
var_export($this->arrayToObject($arr));

输出:

array(
    0 => 'a',
    1 => 'b',
    2 => 'c',
)
array(
    0 => 'a',
    1 => 'b',
    2 => 'c',
)

测试 2:对象数组

$arr = [["a" => 1], ["a" => 1], ["a" => 1]];
var_export(json_decode(json_encode($arr)));
var_export($this->arrayToObject($arr));

输出:

array(
    0 => stdClass::__set_state(array('a' => 1,)),
    1 => stdClass::__set_state(array('a' => 1,)),
    2 => stdClass::__set_state(array('a' => 1,)),
)
array(
    0 => stdClass::__set_state(array('a' => 1,)),
    1 => stdClass::__set_state(array('a' => 1,)),
    2 => stdClass::__set_state(array('a' => 1,)),
)

测试 3:对象

$arr = ["a" => 1];
var_export(json_decode($arr));
var_export($this->arrayToObject($arr));

输出:

stdClass::__set_state(array('a' => 1,))
stdClass::__set_state(array('a' => 1,))
3赞 DavidH 8/25/2015 #21

使用是有问题的,因为它处理非 UTF-8 数据的方式。值得注意的是,/ 方法还将非关联数组保留为数组。这可能是也可能不是你想要的。我最近需要重新创建此解决方案的功能,但不使用函数。这是我想出的:json_encodejson_encodejson_encodejson_

/**
 * Returns true if the array has only integer keys
 */
function isArrayAssociative(array $array) {
    return (bool)count(array_filter(array_keys($array), 'is_string'));
}

/**
 * Converts an array to an object, but leaves non-associative arrays as arrays. 
 * This is the same logic that `json_decode(json_encode($arr), false)` uses.
 */
function arrayToObject(array $array, $maxDepth = 10) {
    if($maxDepth == 0) {
        return $array;
    }

    if(isArrayAssociative($array)) {
        $newObject = new \stdClass;
        foreach ($array as $key => $value) {
            if(is_array($value)) {
                $newObject->{$key} = arrayToObject($value, $maxDepth - 1);
            } else {
                $newObject->{$key} = $value;
            }
        }
        return $newObject;
    } else {

        $newArray = array();
        foreach ($array as $value) {
            if(is_array($value)) {
                $newArray[] = arrayToObject($value, $maxDepth - 1);
            } else {
                $newArray[] = $value;
            }                
        }
        return $newArray;
    }
}
7赞 MinhajulAnwar 11/23/2015 #22

递归是你的朋友:

function __toObject(Array $arr) {
    $obj = new stdClass();
    foreach($arr as $key=>$val) {
        if (is_array($val)) {
            $val = __toObject($val);
        }
        $obj->$key = $val;
    }

    return $obj;
}
51赞 Dixit 3/4/2016 #23

这太简单了,这也将为递归数组创建一个对象:

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

评论

4赞 Ikhlak S. 10/25/2016
传递给将返回一个关联数组。falsejson_decode()
9赞 Elliot Reed 9/12/2018
@user3284463 传递到将返回一个关联数组,是默认值,将返回一个实例。truejson_decodefalseStdClass
0赞 mickmackusa 9/12/2023
看起来像是 stackoverflow.com/a/9895734/2943403 的后期副本
4赞 Zezeron 4/3/2016 #24

世界上最好的方法:)

function arrayToObject($conArray)
{
    if(is_array($conArray)){
        /*
        * Return array converted to object
        * Using __FUNCTION__ (Magic constant)
        * for recursive call
        */
        return (object) array_map(__FUNCTION__, $conArray);
    }else{
        // Return object
        return $conArray;
    }
}

如果你使用不同的方法,你会遇到问题。这是最好的方法。你见过。

0赞 Tschallacka 6/3/2016 #25

我使用以下方法将 Yaml 文件关联数组解析为对象状态。

这将检查所有提供的数组是否有隐藏的对象,并将它们也转到对象中。

    /**
     * Makes a config object from an array, making the first level keys properties a new object.
     * Property values are converted to camelCase and are not set if one already exists.
     * @param array $configArray Config array.
     * @param boolean $strict To return an empty object if $configArray is not an array
     * @return stdObject The config object
     */
    public function makeConfigFromArray($configArray = [],$strict = true)
    {
        $object = new stdClass();

        if (!is_array($configArray)) {
            if(!$strict && !is_null($configArray)) {
                return $configArray;
            }
            return $object;
        }

        foreach ($configArray as $name => $value) {
            $_name = camel_case($name);
            if(is_array($value)) {
                $makeobject = true;
                foreach($value as $key => $val) {
                    if(is_numeric(substr($key,0,1))) {
                        $makeobject = false;
                    }
                    if(is_array($val)) {
                        $value[$key] = $this->makeConfigFromArray($val,false);
                    }
                }
                if($makeobject) {
                    $object->{$name} = $object->{$_name} = $this->makeConfigFromArray($value,false);
                }
                else {
                    $object->{$name} = $object->{$_name} = $value;
                }

            }
            else {
                $object->{$name} = $object->{$_name} = $value;
            }
        }

        return $object;
    }

这会将 yaml 配置为

fields:
    abc:
        type: formfield
        something:
            - a
            - b
            - c
            - d:
                foo: 
                   bar

到包含以下内容的数组:

array:1 [
  "fields" => array:1 [
    "abc" => array:2 [
      "type" => "formfield"
      "something" => array:4 [
        0 => "a"
        1 => "b"
        2 => "c"
        3 => array:1 [
          "d" => array:1 [
            "foo" => "bar"
          ]
        ]
      ]
    ]
  ]
]

到以下对象:

{#325
  +"fields": {#326
    +"abc": {#324
      +"type": "formfield"
      +"something": array:4 [
        0 => "a"
        1 => "b"
        2 => "c"
        3 => {#328
          +"d": {#327
            +"foo": "bar"
          }
        }
      ]
    }
  }
}
6赞 Douraid Arfaoui 9/28/2016 #26

使用我制作的这个函数:

function buildObject($class,$data){
    $object = new $class;
    foreach($data as $key=>$value){
        if(property_exists($class,$key)){
            $object->{'set'.ucfirst($key)}($value);
        }
    }
    return $object;
}

用法:

$myObject = buildObject('MyClassName',$myArray);
11赞 Ankit Vishwakarma 5/17/2017 #27

技术有点复杂,但易于扩展:

假设你有一个数组

$a = [
     'name' => 'ankit',
     'age' => '33',
     'dob' => '1984-04-12'
];

假设您有一个 Person 类,该类可能具有来自此数组的或多或少属性。例如

class Person 
{
    private $name;
    private $dob;
    private $age;
    private $company;
    private $city;
}

如果您仍想将数组更改为 person 对象。可以使用 ArrayIterator 类。

$arrayIterator = new \ArrayIterator($a); // Pass your array in the argument.

现在你有了迭代器对象。

创建一个扩展 FilterIterator 类的类;您必须定义抽象方法 accept。按照示例操作

class PersonIterator extends \FilterIterator
{
    public function accept()
    {
        return property_exists('Person', parent::current());
    }
}

仅当该属性存在于类中时,上述强制才会绑定该属性。

在类 PersonIterator 中再添加一个方法

public function getObject(Person $object)
{
        foreach ($this as $key => $value)
        {
            $object->{'set' . underscoreToCamelCase($key)}($value);
        }
        return $object;
}

确保在类中定义了赋值器。 现在,您可以在要创建对象的位置调用这些函数。

$arrayiterator = new \ArrayIterator($a);
$personIterator = new \PersonIterator($arrayiterator);

$personIterator->getObject(); // this will return your Person Object. 
6赞 YesItsMe 9/7/2017 #28

一个衬垫

$object= json_decode(json_encode($result_array, JSON_FORCE_OBJECT));

评论

1赞 The Coprolal 12/13/2018
请注意,存储在原始数组中的引用(例如对其他数组的引用)将被此单行代码复制。假设数组中的键包含对另一个数组的引用。然后,在执行后,您的单行代码将是 的副本,而不是相同的数组。x$object->x$result_array['x']
7赞 Chris Jeffries 11/10/2017 #29

这需要 PHP7,因为我选择使用 lambda 函数来锁定 main 函数中的“innerfunc”。lambda 函数是递归调用的,因此需要:“use ( &$innerfunc )”。你可以在 PHP5 中做到这一点,但无法隐藏内部功能。

function convertArray2Object($defs) {
    $innerfunc = function ($a) use ( &$innerfunc ) {
       return (is_array($a)) ? (object) array_map($innerfunc, $a) : $a; 
    };
    return (object) array_map($innerfunc, $defs);
}
8赞 TimSparrow 4/11/2018 #30

我使用的那个(它是一个类成员):

const MAX_LEVEL = 5; // change it as needed

public function arrayToObject($a, $level=0)
{

    if(!is_array($a)) {
        throw new InvalidArgumentException(sprintf('Type %s cannot be cast, array expected', gettype($a)));
    }

    if($level > self::MAX_LEVEL) {
        throw new OverflowException(sprintf('%s stack overflow: %d exceeds max recursion level', __METHOD__, $level));
    }

    $o = new stdClass();
    foreach($a as $key => $value) {
        if(is_array($value)) { // convert value recursively
            $value = $this->arrayToObject($value, $level+1);
        }
        $o->{$key} = $value;
    }
    return $o;
}
3赞 Krishnamoorthy Acharya 11/4/2018 #31

将多维数组转换为对象。此代码用于 Bing 搜索 API try 和 catch 方法的转换。

try {
        // Perform the Web request and get the JSON response
        $context = stream_context_create($options);
        $results = file_get_contents($url . "?cc=" . $country . "&category=" . $type, false, $context);
        $results = json_decode($results);
        return response()->json($results);
    } catch (\Exception $e) {
        $results = array('value' => array(
                (object) array(
                    "name" => "Unable to Retrive News",
                    "url" => "http://www.sample.com/",
                    "image" => (object) array("thumbnail" => (object) array("contentUrl" => "")),
                    "publishedAt" => "",
                    "description" => "")
            )
        );
        $results = (object) $results;
        return response()->json($results);
    }
3赞 celsowm 5/11/2019 #32

您可以使用反射:

<?php

$array = ['name'=>'maria','age'=>33];

class Person {

    public $name;
    public $age;

    public function __construct(string $name, string $age){
        $this->name  = $name;
        $this->age = $age;
    }
}

function arrayToObject(array $array, string $class_name){

    $r = new ReflectionClass($class_name);
    $object = $r->newInstanceWithoutConstructor();
    $list = $r->getProperties();
    foreach($list as $prop){
      $prop->setAccessible(true);
      if(isset($array[$prop->name]))
        $prop->setValue($object, $array[$prop->name]);
    } 

    return $object;

}

$pessoa1 = arrayToObject($array, 'Person');
var_dump($pessoa1);
25赞 Noha Shehab 6/12/2019 #33

您可以使用 (object) 函数将数组转换为对象。

$arr= [128=> ['status'=>
                 'Figure A. Facebook \'s horizontal scrollbars showing up on a 1024x768 screen resolution.'],
                  129=>['status'=>'The other day at work, I had some spare time']];

            $ArrToObject=(object)$arr;
            var_dump($ArrToObject);

结果将是一个包含数组的对象:

对象(标准类)#1048 (2) { [128]=> 数组(1) {

[“状态”]=> string(87) “图 A. Facebook 的水平滚动条显示在 1024x768 的屏幕上。

[129]=>数组(1) { [“状态”]=> string(44) “前几天上班,我有一些空闲时间” } }

评论

2赞 habib 2/12/2021
这里(对象)不是一个函数,你只是做了类型转换。
0赞 Ari Cooper-Davis 3/18/2021
严格来说,这不是类型转换,因为你要更改的是值类型,而不是变量。查看 stackoverflow.com/a/1147377/6144626
30赞 Uchephilz 7/15/2020 #34

我也有这个问题,但我注意到json_decode将JSON数组转换为对象。

因此,我通过使用返回对象的 JSON 字符串的 json_encode($PHPArray) 来制定解决方案,然后使用 Json_decode($string) 解码该字符串,它将返回一个结构完美的对象。速记

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

$jsonString = json_encode($array);
$object = json_decode($jsonString);

评论

0赞 Alex78191 11/25/2021
实际上,JSON对象
0赞 PHZ.fi-Pharazon 4/3/2021 #35

如果你需要将数组转换为特定类(就像我的情况一样,我的模拟需要对象的类型为 Google_Service_AndroidPublisher_Resource_Inappproducts),你可以将类名从 stdClass str_replace到预期的类,如下所示:

function castArrayToClass(array $array, string $className)
{
    //first cast the array to stdClass
    $subject = serialize((object)$array);
    //then change the class name
    $converted = str_replace(
        'O:8:"stdClass"',
        'O:'.strlen($className).':"'.$className.'"',
        $subject
    );
    unset($subject);

    return unserialize($converted);
}