2011-09-20 6 views
6

Tôi có tập tin INI tiếp theo:INI file vào mảng đa chiều trong PHP

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

Tôi phân tích tập tin này bằng parse_ini_file. Và nó trả về:

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

Nhưng tôi muốn tạo mảng đa chiều. Chuyến đi của tôi phải là:

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

Cảm ơn bạn trước.

Trả lời

5

Đây là cách tôi nhìn thấy nó:

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

Đó là một lớp học của tôi để phân tích các file cấu hình ini để một mảng đa chiều:

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; 
    } 
} 
2

Hãy nhìn vào lớp Zend_Config_Ini. Nó làm những gì bạn muốn, bạn có thể sử dụng nó độc lập (không có phần còn lại của Zend Framework) và như một phần thưởng nó hỗ trợ phần thừa kế.

Với phương thức toArray bạn có thể tạo mảng từ đối tượng cấu hình.

+0

Cảm ơn bạn. Tôi đã kiểm tra mã Zend_Config_Ini để sử dụng trong ứng dụng của mình) – pltvs

2

Hãy xem PHProp.

Tương tự như Zend_Config_Ini, nhưng bạn có thể tham khảo một chìa khóa trong cấu hình của bạn như ${key}

4

Nó thực sự khá đơn giản, bạn chỉ cần thay đổi định dạng của các mảng bạn đã có bằng nổ nó là chìa khóa:

$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); 

Output:

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

       ) 

     ) 

) 

Xem cũng như: String with array structure to Array.

+0

Tôi nghĩ bạn cần tổ chức nó thành đệ quy – volter9