【问题标题】:How to create nested object from nested arrays in php如何从 php 中的嵌套数组创建嵌套对象
【发布时间】:2012-08-25 17:47:50
【问题描述】:

我有这样的代码,初始化配置

    $this->config = array(
        'users' => array(
            array('name' => 'admin',
                  'password' => $password
            )
        ),
        'tokens' => array(),
        'sessions' => array(),
    );

我正在使用 json_encode($this->config) 保存到文件中,然后我使用

加载它
json_decode(file_get_contents('file.json'));

它创建嵌套对象,我希望在初始化和配置时拥有这个嵌套对象,除了这个之外,还有其他方法可以创建这个嵌套对象吗?

$this->config = json_decode(json_encode($this->config));

【问题讨论】:

  • 您希望您的数组成为一个对象,或者更好地成为嵌套对象的集合?
  • @moonwave99 是的,assoc 数组 array('foo' => 'bar') 的 json_encode 返回 {"foo": "bar"},当您使用 json_decode('{"foo": "bar"}') 时它会成为一个对象,因此您可以通过 $array['foo'] 而不是 $array['foo'] 访问它 - json_decode 创建实例stdClass
  • 无论如何,为什么不直接第一次按对象存储数据,而不传递关联数组?
  • 因为 php 没有在 javascript 中创建像 JSON 这样的对象的语法,我需要使用像 $this->config = new stdClass(); $admin = new stdClass(); $admin->user = 'admin'; $admin->password = $password; $this->config->users = array($admin); ... 这样的东西,我更喜欢一种表达方式。我发布解决方案。
  • 但是php有!只需定义一个User 类并提供一个构造函数:你会得到类似new User('admin', $password) 的东西。

标签: php arrays json object


【解决方案1】:

您也可以使用此功能

<?php
function arrayToObject($array) {
    if(!is_array($array)) {
        return $array;
    }

    $object = new stdClass();
    if (is_array($array) && count($array) > 0) {
      foreach ($array as $name=>$value) {
         $name = strtolower(trim($name));
         if (!empty($name)) {
            $object->$name = arrayToObject($value);
         }
      }
      return $object;
    }
    else {
      return FALSE;
    }
}
?>

【讨论】:

  • 没关系,但它摆脱了数字索引数组 [e.g.给定示例中的users 数组],它应该保留为对象集合 - 只需检查$name 是否不是数字。
  • @moonwave99 是的,它应该检查is_integer(array_keys($array)[0]),然后使用return array_map('arrayToObject', $array);
【解决方案2】:

我决定改用这个函数

function object($array) {
    $object = new stdClass();
    foreach ($array as $k => $v) {
        $object->$k = $v;
    }
    return $object;
}

并为关联数组显式调用它

$this->config = object(array(
    'users' => array(
        object(array(
            'name' => 'admin',
            'password' => $password
        ))
    ),
    'tokens' => array(),
    'sessions' => array(),
));

编辑递归代码

function is_assoc($array) {
    if (!is_array($array)) {
        return false;
    } else {
        $keys = array_keys($array);
        return !is_numeric($keys[0]);
    }
}

function object($array) {
    if (is_assoc($array)) {
        $object = new stdClass();
        foreach ($array as $k => $v) {
            $object->$k = object($v);
        }
        return $object;
    } else {
        return $array;
    }
}

【讨论】:

  • 顺便说一句,您不需要这样做 - 只需将您的数组转换为对象:(object)($this -&gt; config) 以获得您的自定义函数的作用。
  • @moonwave99 我不知道你可以转换成函数。但是 cast 不是递归的,第二个函数只会从第一个数组创建对象。但无论如何我决定把这个数组放到对象中。
猜你喜欢
  • 1970-01-01
  • 2019-10-06
  • 2021-08-02
  • 1970-01-01
  • 2021-11-28
  • 2012-05-05
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多