2011-09-20 26 views
6

Tengo el siguiente archivo INI:archivo INI de matriz multidimensional en PHP

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

estoy al analizar este archivo usando parse_ini_file. Y vuelve:

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

Pero quiero crear una matriz multidimensional. Mi outout debe ser:

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

Gracias de antemano.

Respuesta

5

Así es como lo veo:

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

Es un mi clase para analizar archivos de configuración ini a una matriz multidimensional:

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

Tener un vistazo a la clase Zend_Config_Ini. Hace lo que quiere, puede usarlo de forma autónoma (sin el resto de Zend Framework) y, como bonificación, es compatible con la herencia de secciones.

Con el método toArray puede crear una matriz desde el objeto de configuración.

+0

Gracias. He comprobado el código Zend_Config_Ini para usar en mi aplicación) – pltvs

2

Eche un vistazo a PHProp.

similares a Zend_Config_Ini, pero se puede hacer referencia a una clave en su configuración como ${key}

4

En realidad es bastante simple, sólo es necesario cambiar el formato de la matriz que ya tiene por la explosión es clave:

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

salida:

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

       ) 

     ) 

) 

Ver también: String with array structure to Array.

+0

Creo que es necesario organizarlo en recursión – volter9

Cuestiones relacionadas