多维数组到对象的特定方法 [英] Multidimensional array to object, specific way
问题描述
我知道这类问题已经问了很多,但我还没有找到如何做到的方法.
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屋!