2011-09-20 11 views
6

mam następny plik INI:plik INI do wielowymiarowej tablicy w PHP

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

ja parsowania ten plik używając parse_ini_file. I zwraca:

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

Ale chcę utworzyć tablicę wielowymiarową. Mój outout powinien być:

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

Z góry dziękuję.

Odpowiedz

5

To jak ja to widzę:

<?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

Jest to moja klasa do parsowania plików config ini do wielowymiarowej tablicy:

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

Wystarczy popatrzeć na klasy Zend_Config_Ini. Robi to, co chcesz, możesz użyć go samodzielnie (bez reszty Zend Framework), a jako bonus obsługuje dziedziczenie sekcji.

Metodą toArray można utworzyć tablicę z obiektu konfiguracyjnego.

+0

Dziękuję. Sprawdziłem kod Zend_Config_Ini w moim wniosku) – pltvs

2

Spójrz na PHProp.

podobne do Zend_Config_Ini, ale można odnieść do klawisza w config jak ${key}

4

To całkiem proste, trzeba tylko zmienić format tablicy już masz przez eksplodujące To klucz:

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

wyjściowa:

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

       ) 

     ) 

) 

Zobacz także: String with array structure to Array.

+0

Myślę, że trzeba to zorganizować w rekurencję – volter9

Powiązane problemy