> -----Original Message-----
> From: Daevid Vincent [mailto:[email protected]]
> Sent: Tuesday, November 09, 2010 6:55 PM
> To: '[email protected]'
> 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