【问题标题】:INI file to multidimensional array in PHPINI 文件到 PHP 中的多维数组
【发布时间】:2011-11-20 19:17:36
【问题描述】:

我有下一个 INI 文件:

a.b.c = 1
a.b.d.e = 2

我正在使用 parse_ini_file 解析这个文件。它返回:

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

但我想创建一个多维数组。我的出局应该是:

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

提前谢谢你。

【问题讨论】:

    标签: php arrays parsing ini


    【解决方案1】:

    这就是我的看法:

    <?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'));
    

    【讨论】:

      【解决方案2】:

      其实很简单,你只需要通过exploding它的key来改变你已经拥有的数组的格式:

      $ini_preparsed = array(
          'a.b.c' => 1,
          'a.b.d.e' => 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
                              )
      
                      )
      
              )
      
      )
      

      另请参阅:String with array structure to Array

      【讨论】:

      • 我觉得你需要把它组织成递归
      【解决方案3】:

      看看Zend_Config_Ini 类。它做你想做的事,你可以独立使用它(没有 Zend 框架的其余部分),而且它支持部分继承。

      使用toArray 方法,您可以从配置对象创建一个数组。

      【讨论】:

      • 谢谢。我已经在我的应用程序中检查了 Zend_Config_Ini 代码)
      【解决方案4】:

      看看PHProp

      类似于Zend_Config_Ini,但您可以参考配置中的一个键,例如${key}

      【讨论】:

        【解决方案5】:

        这是我的一个类,用于将配置 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;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2017-07-04
          • 2013-04-26
          • 2021-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-18
          相关资源
          最近更新 更多