2011-09-20 4 views
6

J'ai le prochain fichier INI:fichier INI tableau multidimensionnel en PHP

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

J'analyse ce fichier en utilisant parse_ini_file. Et il retourne:

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

Mais je veux créer un tableau multidimensionnel. Mon outout devrait être:

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

Merci d'avance.

Répondre

5

Voilà comment je vois:

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

C'est une ma classe pour analyser les fichiers de configuration ini à un tableau multidimensionnel:

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

Jetez un oeil à la classe Zend_Config_Ini. Il fait ce que vous voulez, vous pouvez l'utiliser seul (sans le reste de Zend Framework) et en bonus il supporte l'héritage de section. La méthode toArray permet de créer un tableau à partir de l'objet de configuration.

+0

Merci. J'ai vérifié le code Zend_Config_Ini pour l'utiliser dans mon application) – pltvs

2

Jetez un coup d'œil à PHProp.

similaires à Zend_Config_Ini, mais vous pouvez vous référer à une clé dans votre config comme ${key}

4

Il est en fait assez simple, il vous suffit de changer le format du tableau que vous avez déjà en faisant exploser c'est la clé:

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

sortie:

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

       ) 

     ) 

) 

Voir aussi: String with array structure to Array.

+0

Je pense que vous devez l'organiser en récursion – volter9