Я знаю, что этот вопрос задан очень часто, но я не узнал, как это сделать, как будто я хочу, чтобы это было.
Итак, в основном у меня есть этот массив.
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;