> -----Original Message----- > From: Daevid Vincent [mailto:daevid@xxxxxxxxxx] > Sent: Tuesday, November 09, 2010 6:55 PM > To: 'php-general@xxxxxxxxxxxxx' > Subject: Help with variable variables not being set for a > multi-dimensional array > > I've used variable variables before but for some reason I > can't figure this snippet out. Why doesn't $ini_file get set > (or appended to). Is there a better more elegant solution to > parsing these keys and splitting them into sub-array keys as > you see what I'm trying to do. I was thinking some recursion, > but it seems overkill for such a simple task. > > Given an .ini file like so: > > [production] > agis_core.adapter = Mysqli > agis_core.params.host = 10.10.10.46 > agis_core.params.username = USERNAME > agis_core.params.password = PASSWORD > agis_core.params.dbname = agis_core > agis_core.params.port = 3306 > > I'm writing a simple parser (to be semi-compatible with the > Zend Framework one apparently but without the bloat of ZF) > > require_once $path.'/../classes/IniParser.class.php'; > try > { > $config_ini = new IniParser($path.'/../config.ini', true, true); > } > catch (Exception $e) > { > echo 'Caught Exception parsing ini > file.<br>'.$e->getMessage()."\n"; > } > > > class IniParser > { > private $file; > public $ini_array; > > function __construct($file, $process_sections=true, > $explode=false) > { > $this->file = $file; > $this->ini_array = > parse_ini_file($file,$process_sections); > if (!$this->ini_array) > { > //we only check this if we failed since > Disk I/O is expensive > if (!file_exists($file)) throw new > Exception('File Not Found: '.$file); > } > > if ($explode) $this->explode_ini(); > } > > public function explode_ini() > { > $ini_array = array(); > > foreach($this->ini_array as $heading => $key_vals) > { > foreach ($key_vals as $k => $v) > { > $path = 'ini_array[\''.$heading.'\']'; > $subsection = explode('.', $k); > foreach ($subsection as $ss) > $path .= '[\''.$ss.'\']'; > //echo $path.' = '.$v.'<br>'; > $$path = $v; > var_dump($path, $$path, $ini_array); > } > } > > $this->ini_array = $ini_array; > } > } > ?> > > But the $ini_array is not being set?!? Here is the output I get... > > string 'ini_array['production']['agis_core']['adapter']' (length=47) > > string 'Mysqli' (length=6) > > array > empty > > string > 'ini_array['production']['agis_core']['params']['host']' (length=54) > > string '10.10.10.46' (length=11) > > array > empty > > string > 'ini_array['production']['agis_core']['params']['username']' > (length=58) > > string 'USERNAME' (length=7) > > array > empty > > ... > FYI, if I swap out the guts with this snippet: foreach ($key_vals as $k => $v) { $path = 'ini_array[\''.$heading.'\']'; $subsection = explode('.', $k); foreach ($subsection as $ss) $path .= '[\''.$ss.'\']'; $path = '$'.$path.' = \''.$v.'\';'; eval($path); //it's not elegant but it works! } It works. Not sure if it's any better or worse than the other hack though. I'd still like to know what is wrong with the initial version for future reference. -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php