2011-09-20 18 views
6

ho il file successivo INI:INI file in array multidimensionale in PHP

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

sto parsing questo file usando parse_ini_file. E restituisce:

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

Ma voglio creare un array multidimensionale. La mia uscita dovrebbe essere:

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

Grazie in anticipo.

risposta

5

Questo è come la vedo io:

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

E 'una mia classe per analizzare file di configurazione ini ad un array multidimensionale:

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

Dai un'occhiata alla classe Zend_Config_Ini. Fa quello che vuoi, puoi usarlo da solo (senza il resto di Zend Framework) e come bonus supporta l'ereditarietà delle sezioni.

Con il metodo toArray è possibile creare un array dall'oggetto di configurazione.

+0

Grazie. Ho controllato il codice Zend_Config_Ini per l'utilizzo nella mia applicazione) – pltvs

2

Dai uno sguardo allo PHProp.

Simile a Zend_Config_Ini, ma è possibile fare riferimento a una chiave nella configurazione come ${key}

4

In realtà è abbastanza semplice, è solo bisogno di cambiare il formato della matrice hai già facendo esplodere è la chiave:

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

uscita:

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

       ) 

     ) 

) 

Vedi pure: String with array structure to Array.

+0

Penso che sia necessario organizzarlo in ricorsione – volter9

Problemi correlati