多维数组到对象的特定方法 [英] Multidimensional array to object, specific way

查看:56
本文介绍了多维数组到对象的特定方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道这类问题已经问了很多,但我还没有找到如何做到的方法.

I know this type of question has been asked a lot, but I haven't found out how to do it like I want it to be.

所以,基本上我有这个数组.

So, basically I have this array.

array(7) {
  ["site"]=>
  array(5) {
    ["production"]=>
    bool(false)
    ["url"]=>
    string(29) "http://localhost/"
    ["name"]=>
    string(6) "Sitename"
    ["title"]=>
    string(7) ": Index"
    ["pagedata"]=>
    array(1) {
      ["default"]=>
      string(5) "Index"
    }
  }
  ["DB"]=>
  array(5) {
    ["host"]=>
    string(9) "localhost"
    ["user"]=>
    string(4) "root"
    ["pass"]=>
    string(4) "secret"
    ["database"]=>
    string(12) "database"
    ["engine"]=>
    string(7) "eMySQLi"
  }
  ["cache"]=>
  array(2) {
    ["file"]=>
    array(1) {
      ["time"]=>
      int(500)
    }
    ["memcache"]=>
    array(2) {
      ["my_first_vps_ip"]=>
      string(17) "my_first_vps_port"
      ["my_second_vps_ip"]=>
      string(18) "my_second_vps_port"
    }
  }
  ["skin"]=>
  array(2) {
    ["name"]=>
    string(9) "thehabbos"
    ["mobile"]=>
    array(2) {
      ["enabled"]=>
      bool(true)
      ["name"]=>
      string(16) "mobile_thehabbos"
    }
  }
  ["lang"]=>
  array(1) {
    ["name"]=>
    string(7) "English"
  }
  ["widget"]=>
  array(1) {
    ["default"]=>
    string(7) "Icecron"
  }
  ["cron"]=>
  array(1) {
    ["DatabaseBackup"]=>
    array(1) {
      ["execute_every"]=>
      int(86400)
    }
  }
}

因此,如果我使用这种方法解析"此数组(将该数组转换为对象)..

So, if I 'parse' this array ( convert the array into an object ) with a method like this one..

    private function parse($arr)
    {
        foreach ($arr as $key => $val) 
        {
            $this->{$key} = is_array($val) ? $this->parse($val) : $val;
        }
        return $this;
    }

我最终会得到类似...

I'll end up with something like...

object(Configure)#3 (27) {
  ["production"]=>
  bool(false)
  ["url"]=>
  string(29) "http://localhost/RevFramework"
  ["name"]=>
  string(7) "English"
  ["title"]=>
  string(7) ": Index"
  ["default"]=>
  string(7) "Icecron"
  ["pagedata"]=>
  *RECURSION*
  ["site"]=>
  *RECURSION*
  ["host"]=>
  string(9) "localhost"
  ["user"]=>
  string(4) "root"
  ["pass"]=>
  string(4) "root"
  ["database"]=>
  string(12) "rev_database"
  ["engine"]=>
  string(7) "eMySQLi"
  ["DB"]=>
  *RECURSION*
  ["time"]=>
  int(500)
  ["file"]=>
  *RECURSION*
  ["my_first_vps_ip"]=>
  string(17) "my_first_vps_port"
  ["my_second_vps_ip"]=>
  string(18) "my_second_vps_port"
  ["memcache"]=>
  *RECURSION*
  ["cache"]=>
  *RECURSION*
  ["enabled"]=>
  bool(true)
  ["mobile"]=>
  *RECURSION*
  ["skin"]=>
  *RECURSION*
  ["lang"]=>
  *RECURSION*
  ["widget"]=>
  *RECURSION*
  ["execute_every"]=>
  int(86400)
  ["DatabaseBackup"]=>
  *RECURSION*
  ["cron"]=>
  *RECURSION*
}

因此,我可以像这样使用它.

So, like that I could use it like this..

echo $this->url;

但是我想做的就是像这样使用它.

But what I want to do, is use it like this..

echo $this->site->url;

如果可能的话,我如何实现这一目标的任何想法?

Any idea on how I could accomplish this, if possible?

推荐答案

您需要实例化一个新对象,以将数组值设置为打开状态.除非您有更具体的说明,否则stdClass可以做到:

You'll need to instantiate a new object for your array values to set properties on. Unless you have something more specific, a stdClass will do:

private function parse(array $arr, stdClass $parent = null) {
    if ($parent === null) {
        $parent = $this;
    }

    foreach ($arr as $key => $val) {
        if (is_array($val)) {
            $parent->$key = $this->parse($val, new stdClass);
        } else {
            $parent->$key = $val;
        }
    }

    return $parent;
}

这篇关于多维数组到对象的特定方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆