> -----Original Message-----
> From: Daevid Vincent [mailto:dae...@daevid.com] 
> Sent: Tuesday, November 09, 2010 6:55 PM
> To: 'php-general@lists.php.net'
> 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

Reply via email to