parse_ini_file() для многомерных массивов

uchenik

Новичок
parse_ini_file() для многомерных массивов

Я расширил функцию parse_ini_file() для разбора конфиг-файла с массивом настроек неограниченной вложенности.

Данные в файле следует записывать следующим образом:

[football]

season = 2005/2006

[football/Russia]

0 = Zenit
1 = Spartak

[football/Spain]

0 = Real Madrid
1 = Valencia

и т.д.

На выходе получим массив:
PHP:
Array
(
    [football] => Array
        (
            [season] => 2005/2006
            [Russia] => Array
                (
                    [0] => Zenit
                    [1] => Spartak
                )

            [Spain] => Array
                (
                    [0] => Real Madrid
                    [1] => Valencia
                )

        )

)
Если кому пригодится - вот код функции:

PHP:
function parse_config_file($file, $separator)
{
  function infill(&$config, &$k, $v)
  {
    while(list($key, $configkey) = each($k))
    {
      if($key + 1 == sizeof($k)) {
        $config[$configkey] = $v;
      }
      infill($config[$configkey], $k, $v);
    }
  }

  $config = array();
  $data = parse_ini_file($file, true);

  foreach($data as $k => $v) {
    infill($config, explode($separator, $k), $v);
  }
  
  return $config;
}
, где

$file - конфиг-файл
$separator - разделитель ключей между квадратных скобок "[ ]"
 

SiMM

Новичок
> Я расширил функцию parse_ini_file()
А от нас-то ты чего хочешь? Кроме того - это уже было. При чём - совсем недавно.
http://phpclub.ru/talk/showthread.php?threadid=70594
PS: и ещё - вкладывать функцию в функцию - абсолютно бессмысленно и бесполезно.
 

Лисю

Guest
+ нужно вынести в список параметров флаг, указывающтй, как именно определять данные - как массив или как обычные переменные.

А вот моя реализация parse_ini_file для случая, когда safe_mod в on:

PHP:
	function my_parse_ini_file($in, $flag=0){
	$file = file($in);
	$varname = "";
	$array = array();
		for($i=0; $i<count($file); $i++){
			$str = trim($file[$i]);
			if($str){
				if($str[0]==";")	continue;
				if(preg_match("#\\[([a-z0-9_\\-\\.]+)\\]#i", $str, $regs))
					$varname = $regs[1];
				if(preg_match_all("#^([a-z0-9_\\-\\.]+) ?= ?\"?(.*?)?\"?$#i", $str, $regs)){
					$regs[2][0] = strtolower($regs[2][0])==="off" ? 0 : $regs[2][0];
					$regs[2][0] = strtolower($regs[2][0])==="on" ? 1 : $regs[2][0];
					if($varname && $flag)	$array[$varname][$regs[1][0]] = $regs[2][0];
					else $array[$regs[1][0]] = $regs[2][0];
				}
			}
		}
		return $array;
	}
 

uchenik

Новичок
SiMM, спасибо за ссылку.

В том обсуждении уже предложен вариант, но моя идея отличается форматом конфиг-файла.
Думаю, указание ключей один раз заметно выигрывает в читабельности для многомерных массивов.
Сравни первый и второй варианты:
PHP:
// 1
[football/Germany/Bundesliga]

1 = Bayern
2 = Bochum
......

// 2
[football]

Germany/Bundesliga/1 = Bayern
Germany/Bundesliga/2 = Bochum
.......
Свою громоздкую функцию я немного переделал и код получился простым и понятным:

PHP:
function parse_config_file($file, $separator)
{
  $data = parse_ini_file($file, true);

  foreach($data as $key => $settings)
  {
    $a = &$config;
    foreach(explode($separator, $key) as $part) {
      $a = &$a[$part];
    }
    $a = $settings;
  }
  return $config;
}


$config = parse_config_file('config.ini', '/');
print_r($config);
 

Фанат

oncle terrible
Команда форума
дааа.... в век XML ещё находятся люди, страдающие такой фигнёй
 

Лисю

Guest
Фанат
inin файл легче править и конфигурировать, нежели xml. я имею в виду чисто визуально и руками.
 

Фанат

oncle terrible
Команда форума
да-да
десятиуровневый ini файл.
иногда я думаю, что этим людям уже ничего не поможет.
 

Лисю

Guest
Alexandre
ну да... с кучей то тегов...

Фанат
Я не говорю о 10 уровнях.

Что ж php.ini то не сделали в виде xml?
 

Фанат

oncle terrible
Команда форума
Я не говорю о 10 уровнях
тогда брысь из этого топика.
Что ж php.ini то не сделали в виде xml?
во-первых, вопрос не ко мне.
во-вторых, если ты так туп, что не можешь сам на него ответить, то никакие объяснения тебе всё равно не помогут.
 

crocodile2u

http://vbolshov.org.ru
Лисю
А ты видишь в php.ini сложные структуры, с большим уровнем вложенности? Под каждую задачу - свое решение.
 

Лисю

Guest
crocodile2u
В том то и дело! Если у вас 100 уровней вложенности - то xml
А так можно и ini юзать. Что я и делаю, ибо у меня в ini никогда не будет больше 2 уровней вложенности.
 
Сверху