Nimous
Guest
Хранение многомерных массивов в ini-файле.
Задачка-неберучка:
Есть конфиг такой структуры:
[sect1]
key1=1;
key2=2;
[sect2]
key1=1;
key2=2;
[sec3.0]
key1=1;
key2=2;
[sect3.1]
key1.1=1;
key1.2=2;
key2.1.1=1;
и т. д.
--------------------------
Задача:
Используя в качестве разделителя в именах ключей,
напр. '.'(как в данном случае),
Построить многомерный массив такой структуры:
[sect1] => Array
[key1] => 1
[key2] => 2
[sect2] => Array
[key1] => 1
[key2] => 2
[sec3] => Array
[0] => Array
[key1] => 1
[key2] => 2
[1] => Array
[key1] => Array
[1] => 1
[2] => 2
[key2] => Array
[1] => Array
[1] => 1
По этому поводу придумалась функция:
В неё передаётся массив parse_ini_file('file.cfg', 1);
И получается то, что нужно.
Но смущает одно обстоятельство:
eval()...
Знающие люди сказали, что это нехорошо.
И я готов с ними согласиться.
Буду рад, если кто-нибудь поможет найти альтернативный алгоритм,
при сохранении функциональности.
Задачка-неберучка:
Есть конфиг такой структуры:
[sect1]
key1=1;
key2=2;
[sect2]
key1=1;
key2=2;
[sec3.0]
key1=1;
key2=2;
[sect3.1]
key1.1=1;
key1.2=2;
key2.1.1=1;
и т. д.
--------------------------
Задача:
Используя в качестве разделителя в именах ключей,
напр. '.'(как в данном случае),
Построить многомерный массив такой структуры:
[sect1] => Array
[key1] => 1
[key2] => 2
[sect2] => Array
[key1] => 1
[key2] => 2
[sec3] => Array
[0] => Array
[key1] => 1
[key2] => 2
[1] => Array
[key1] => Array
[1] => 1
[2] => 2
[key2] => Array
[1] => Array
[1] => 1
По этому поводу придумалась функция:
PHP:
function parse_config_array( $array=array() ){
static $separator = ".";
$array_result=array();
foreach( $array as $key => $value )
{
if(is_array($value))$value=parse_config_array($value);
if(ereg($separator,$key)){
$nkey='';
foreach (explode($separator,$key) as $part){ @$nkey.=(!empty($part))?"['".$part."']":"[]";}
}
else {$nkey="[".$key."]";}
eval ("\$array_result".$nkey."=\$value;");
}
unset( $array);
return $array_result;
}
И получается то, что нужно.
Но смущает одно обстоятельство:
eval()...
Знающие люди сказали, что это нехорошо.
И я готов с ними согласиться.
Буду рад, если кто-нибудь поможет найти альтернативный алгоритм,
при сохранении функциональности.