INI-файл для многомерного массива в PHP

У меня есть следующий файл INI:

abc = 1 abde = 2 

Я разбираю этот файл с помощью parse_ini_file. И он возвращает:

 array( 'abc' => 1, 'abde' => 2 ) 

Но я хочу создать многомерный массив. Мой выход должен быть:

 array( 'a' => array( 'b' => array( 'c' => 1, 'd' => array( 'e' => 2 ) ) ) ) 

Заранее спасибо.

Related of "INI-файл для многомерного массива в PHP"

Вот как я это вижу:

 <?php class ParseIniMulti { public static function parse($filename) { $ini_arr = parse_ini_file($filename); if ($ini_arr === FALSE) { return FALSE; } self::fix_ini_multi(&$ini_arr); return $ini_arr; } private static function fix_ini_multi(&$ini_arr) { foreach ($ini_arr AS $key => &$value) { if (is_array($value)) { self::fix_ini_multi($value); } if (strpos($key, '.') !== FALSE) { $key_arr = explode('.', $key); $last_key = array_pop($key_arr); $cur_elem = &$ini_arr; foreach ($key_arr AS $key_step) { if (!isset($cur_elem[$key_step])) { $cur_elem[$key_step] = array(); } $cur_elem = &$cur_elem[$key_step]; } $cur_elem[$last_key] = $value; unset($ini_arr[$key]); } } } } var_dump(ParseIniMulti::parse('test.ini')); с <?php class ParseIniMulti { public static function parse($filename) { $ini_arr = parse_ini_file($filename); if ($ini_arr === FALSE) { return FALSE; } self::fix_ini_multi(&$ini_arr); return $ini_arr; } private static function fix_ini_multi(&$ini_arr) { foreach ($ini_arr AS $key => &$value) { if (is_array($value)) { self::fix_ini_multi($value); } if (strpos($key, '.') !== FALSE) { $key_arr = explode('.', $key); $last_key = array_pop($key_arr); $cur_elem = &$ini_arr; foreach ($key_arr AS $key_step) { if (!isset($cur_elem[$key_step])) { $cur_elem[$key_step] = array(); } $cur_elem = &$cur_elem[$key_step]; } $cur_elem[$last_key] = $value; unset($ini_arr[$key]); } } } } var_dump(ParseIniMulti::parse('test.ini')); 

На самом деле это довольно просто, вам нужно только изменить формат массива, который у вас уже есть, взломав его ключ:

 $ini_preparsed = array( 'abc' => 1, 'abde' => 2 ); $ini = array(); foreach($ini_preparsed as $key => $value) { $p = &$ini; foreach(explode('.', $key) as $k) $p = &$p[$k]; $p = $value; } unset($p); print_r($ini); с $ini_preparsed = array( 'abc' => 1, 'abde' => 2 ); $ini = array(); foreach($ini_preparsed as $key => $value) { $p = &$ini; foreach(explode('.', $key) as $k) $p = &$p[$k]; $p = $value; } unset($p); print_r($ini); 

Вывод:

 Array ( [a] => Array ( [b] => Array ( [c] => 1 [d] => Array ( [e] => 2 ) ) ) ) 

См. Также: Строка с структурой массива в массив .

Посмотрите на класс Zend_Config_Ini . Он делает то, что вы хотите, вы можете использовать его автономно (без остальной части Zend Framework), а в качестве бонуса он поддерживает наследование разделов.

С помощью метода toArray вы можете создать массив из объекта конфигурации.

Взгляните на PHProp .

Подобно Zend_Config_Ini , но вы можете ссылаться на ключ в своей конфигурации, например ${key}

Это мой класс для разбора конфигурационных файлов ini в многомерном массиве:

 class Cubique_Config { const SEPARATOR = '.'; private static $_data = null; public static function get() { if (is_null(self::$_data)) { $commonIniFile = APP . '/config' . '/common.ini'; $envIniFile = APP . '/config' . '/' . ENV . '.ini'; if (!file_exists($commonIniFile)) { throw new Exception('\'' . $commonIniFile . '\' config file not found'); } if (!file_exists($envIniFile)) { throw new Exception('\'' . $envIniFile . '\' config file not found'); } $commonIni = parse_ini_file($commonIniFile); $envIni = parse_ini_file($envIniFile); $mergedIni = array_merge($commonIni, $envIni); self::$_data = array(); foreach ($mergedIni as $rowKey => $rowValue) { $explodedRow = explode(self::SEPARATOR, $rowKey); self::$_data = array_merge_recursive(self::$_data, self::_subArray($explodedRow, $rowValue)); } } return self::$_data; } private static function _subArray($explodedRow, $value) { $result = null; $explodedRow = array_values($explodedRow); if (count($explodedRow)) { $firstItem = $explodedRow[0]; unset($explodedRow[0]); $result[$firstItem] = self::_subArray($explodedRow, $value); } else { $result = $value; } return $result; } } с class Cubique_Config { const SEPARATOR = '.'; private static $_data = null; public static function get() { if (is_null(self::$_data)) { $commonIniFile = APP . '/config' . '/common.ini'; $envIniFile = APP . '/config' . '/' . ENV . '.ini'; if (!file_exists($commonIniFile)) { throw new Exception('\'' . $commonIniFile . '\' config file not found'); } if (!file_exists($envIniFile)) { throw new Exception('\'' . $envIniFile . '\' config file not found'); } $commonIni = parse_ini_file($commonIniFile); $envIni = parse_ini_file($envIniFile); $mergedIni = array_merge($commonIni, $envIni); self::$_data = array(); foreach ($mergedIni as $rowKey => $rowValue) { $explodedRow = explode(self::SEPARATOR, $rowKey); self::$_data = array_merge_recursive(self::$_data, self::_subArray($explodedRow, $rowValue)); } } return self::$_data; } private static function _subArray($explodedRow, $value) { $result = null; $explodedRow = array_values($explodedRow); if (count($explodedRow)) { $firstItem = $explodedRow[0]; unset($explodedRow[0]); $result[$firstItem] = self::_subArray($explodedRow, $value); } else { $result = $value; } return $result; } }