Многомерный массив для объекта, особым образом

Я знаю, что этот вопрос задан очень часто, но я не узнал, как это сделать, как будто я хочу, чтобы это было.

Итак, в основном у меня есть этот массив.

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) } } } 

Итак, если я «разбираю» этот массив (преобразовываю массив в объект) с помощью метода, подобного этому.

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

У меня получится что-то вроде …

 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* } по 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* } 

Таким образом, я мог бы использовать его вот так.

 echo $this->url; 

Но то, что я хочу сделать, это использовать так.

 echo $this->site->url; 

Любая идея о том, как я могу это сделать, если это возможно?

Вам нужно создать экземпляр нового объекта для значений массива для установки свойств. Если у вас есть что-то более конкретное, stdClass будет делать:

 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; } 

Я думаю, что это будет делать то, что вы хотите:

 $obj = json_decode(json_encode($my_array)); echo $obj->site->url;