【问题标题】:PHP Array to ObjectPHP 数组到对象
【发布时间】:2015-12-07 15:08:16
【问题描述】:

给定以下数组:

$array = array(
    'item_1' => array(
            'item_1_1' => array(
                    'item_1_1_1' => 'Hello',
            ),
            'item_1_2' => 'World',
    ),
    'item_2' => array(),
);

如何将其转换为对象?

Option 1
$obj = (object) $array;

或者

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

还是别的什么?

我想知道 2 选项之间的输出差异,并了解创建此转换的最佳实践。

【问题讨论】:

  • 尝试使用 json 对我来说似乎很好
  • 我的回答是不要......除非你有一个真正好的理由。数组比对象更灵活、更实用。别管它。

标签: php arrays object


【解决方案1】:

嗯,你以某种方式回答了你自己的问题,但是如果你想拥有一个像你的数组这样的属性的对象,你必须强制转换它,这样一个数组将仍然是一个数组

$obj = (object) $array;

输出:

object(stdClass)#1 (2) {
  ["item_1"]=>
  array(2) {
    ["item_1_1"]=>
    array(1) {
      ["item_1_1_1"]=>
      string(5) "Hello"
    }
    ["item_1_2"]=>
    string(5) "World"
  }
  ["item_2"]=>
  array(0) {
  }
}

如果您使用的是 json_decode 版本,它也会将数组转换为对象:

object(stdClass)#2 (2) {
  ["item_1"]=>
  object(stdClass)#3 (2) {
    ["item_1_1"]=>
    object(stdClass)#4 (1) {
      ["item_1_1_1"]=>
      string(5) "Hello"
    }
    ["item_1_2"]=>
    string(5) "World"
  }
  ["item_2"]=>
  array(0) {
  }
}

注意:这里只有空数组是一个数组。

回答您的问题:最佳实践取决于您的需求。

【讨论】:

  • 发布了一个回答说同样基本的事情,但添加了一个关于在某些情况下将对象转换为破坏数字索引的数组的注释,主要是为了完整性
  • @EliasVanOotegem,这是一个很好的观点,当您简单地将对象转换为数组时也会发生同样的事情,为此,函数 get_object_vars() 很有用:Access array element indexed by numerical string
【解决方案2】:

这实际上取决于:如果您正在处理的数据在一种情况下可能是一个数组,而在下一种情况下是一个对象,那么最好使用json_decode 技巧,因为与强制转换不同,它的结果是“递归”。不过,这里有一件非常重要需要记住的事情:数字索引可以并且可能会在某个时间点给您带来问题。 Take a look at this bug report

这是documented here,但不是很突出:

如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。键是成员变量名称,有几个值得注意的例外:整数属性不可访问;

问题示例:

$data = [
    'foo' => 'bar',
    123   => 'all is well',
];
$obj = json_decode(json_encode($data));
var_dump($obj->foo);//bar
var_dump($obj->{123});//all is well
$cast = (array) $obj;
var_dump($cast);//shows both keys
var_dump(isset($cast[123]));//FALSE!!!
var_dump(isset($cast['123']));//FALSE

基本上:如果您开始将数组转换为对象并再次转换回来,则数字键不再可靠。如果我是你,我会尽可能简单地更改传递数据的代码,或者我会创建一个可以使用数组或对象设置的值对象,并以这种方式规范化数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多