A multidimensional array for an object, in a special way

I know that this question is asked very often, but I did not find out how to do it, as if 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 to an object) using this method ...

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

I will get 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 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 do this, if possible?

+4
source share
2 answers

You need to instantiate a new object for the array values ​​to set properties. If you have something more specific, 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; } 
+6
source

I think this will do what you want:

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

Source: https://habr.com/ru/post/1385048/


All Articles