Хранение многомерных массивов в ini-файле.

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

По этому поводу придумалась функция:
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;
}
В неё передаётся массив parse_ini_file('file.cfg', 1);
И получается то, что нужно.

Но смущает одно обстоятельство:
eval()...

Знающие люди сказали, что это нехорошо.
И я готов с ними согласиться.

Буду рад, если кто-нибудь поможет найти альтернативный алгоритм,
при сохранении функциональности.
 

Фанат

oncle terrible
Команда форума
Задачка-неберучка:
совершенно верно.
поскольку больше никому такое в голову не придёт.
нафига для такой структуры использовать parse_ini_file - загадка.
 

SiMM

Новичок
> нафига для такой структуры использовать parse_ini_file - загадка.
Про это я помолчу, но для примера, чтобы показать, что eval в подобных случаях не нужен и всё прекрасно работает без него, кое-что продемонстрирую (не совсем то, но почти)
PHP:
function parse_config_array(&$array){
  foreach (array_keys($array) as $key)
    if (is_array($value = $array[$key])) parse_config_array($array[$key]);
    else {
      unset($array[$key]);
      $ptr = &$array;
      foreach (explode('.',$key) as $part)
        $ptr = &$ptr[$part];
      $ptr = $value;
    }
}

parse_config_array($data = parse_ini_file('file.cfg',true));
print_r($data);
 

demongloom

Новичок
А данные должны в ini файл вносится пользователем или скрипт использует конфиг для хранения и записи настроек? Потому что если второй вариант, то лучше serialize использовать и не маяться.
 

Nimous

Guest
SiMM
Неплохая штука. Спасибо.
Может быть-это даже "совсем то", поскольку многомерность [в.корневых.ключах] легко обходится.
Спасибо:)



Фанат
больше никому такое в голову не придёт
Видимо, такой уж я нестандартный.
Уж простите пожалуйста...

-~{}~ 27.07.05 09:30:

нафига для такой структуры использовать parse_ini_file
А что нужно использовть для такой структуры?
Если не затруднит.

demongloom
Файл редактируется из панели, но при этом данные ддлжны иметь "Дружественный админу интерфейс".
 

SiMM

Новичок
> А что нужно использовть для такой структуры?
XML, к примеру. Если стандартного parse_ini_file тебе недостаточно.
 
Сверху