RE: Help with variable variables not being set for a multi-dimensional array

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



 

> -----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



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux