parse_ini_file() con arrays de gran profundidad | advanced_parse_ini_file()


Hoy en el trabajo hemos estado tocando un poco Zend Framework. Desde que lo vi me ha llamado mucho la atención el uso que hace de los archivos ini puesto que logra de serie solventar uno de los grandes problemas de estos ficheros: los arrays de gran profundidad.

Aun no conozco lo suficiente Zend como para ver exactamente que función lleva a cabo la tarea pero he visto el truco enseguida y me he decidido a imitarlo en una función para poder usar esta característica en mis archivos ini a partir de ahora. Lo que aquí presento es la función que he creado para parsear de esta forma los archivos ini y disponer así de arrays de la profundidad que deseemos en nuestras definiciones de archivos ini.

Un archivo ini contiene definiciones de variables en un formato cómodo: una línea por definición. Estos archivos son muy usados para marcar configuraciones estáticas en la programación de las páginas. Para ordenar esta información PHP nos brinda solo 2 posibilidades:

1) Podemos crear secciones de variables indicando entre corchetes el nombre de la sección.
2) Podemos definir que una de las variables es un array numérico e ir dándole valores para rellenarla.

De esta forma, el máximo grado de complejidad del que disponemos es el siguiente.

[seccion-A]
elemento1 = Valor del elemento 1
elemento2 = Valor del elemento 2
elemento3[] = primer valor del elemento 3
elemento3[] = segundo valor del elemento 3
elemento3[] = tercer valor del elemento 3

[seccion-B]
elemento1 = Valor del elemento 1
elemento2 = Valor del elemento 2
elemento3[] = primer valor del elemento 3
elemento3[] = segundo valor del elemento 3
elemento3[] = tercer valor del elemento 3

La verdad es que en ocasiones se nos queda corto todo esto…

Para solucionarlo he creado una función en php: advanced_parse_ini_file() que nos permita indicar en la definición de nuestras variables que un valor es en realidad un array asociativo. Al más puro estilo de Zend. La función nos va a permitir indicar el nombre del array asociativo, seguido de un punto y a partir de ahí el nombre de la «key» a la que estamos dando valor. Esto lo hacemos de forma recursiva, con lo que a partir de ahora nuestros archivos ini podrán tener la profundidad que deseemos.

Ahora nuestros archivos ini pueden llegar a ser tan complejos como esto:

[seccion-A]
elemento1.variable1.subvariable1 = Valor de la subvariable 1
elemento1.variable1.subvariable2 = Valor de la subvariable 2
elemento1.variable2 = Valor de la variable 2 
elemento2 = Valor del elemento 2
elemento3[] = primer valor del elemento 3
elemento3[] = segundo valor del elemento 3

[seccion-B]
elemento1.variable1.subvariable1 = Valor de la subvariable 1
elemento1.variable1.subvariable2 = Valor de la subvariable 2
elemento1.variable2 = Valor de la variable 2 
elemento2 = Valor del elemento 2
elemento3[] = primer valor del elemento 3
elemento3[] = segundo valor del elemento 3

Seguidamente dejo un par de links: La explicación de la función parse_ini_file en php.net para solventar cualquier duda sobre archivos ini y la descarga de un archivo zip con un ejemplo de uso de la nueva función.

Para aquellos que solo quieran echarle un vistazo a la función la copio aquí mismo, espero que le saquéis partido.

/**
 * Parsea un archivo ini entendiendo que los "." definen elementos de array asociativos
 * 
 * Consultar parse_ini_file para documentación básica
 * 
 * Inspirado en Zend Framework
 *
 * @author http://blog.ikhuerta.com
 * @param string $ini_file
 * @return mixed
 */
function advanced_parse_ini_file( $ini_file )
{
  $parsed_file = parse_ini_file( $ini_file, true );
  $returnArray = array();
  foreach ($parsed_file as $section => $array)
  {
    foreach ($array as $k => $v)
    {
      if ( strpos($k,".") > -1 )
      {
        $keys = explode(".",$k);
        while ($key = array_pop($keys) )
        {
          $temp[$key] = $v;
          $v = $temp;
          unset($temp);
        }
        $v = array( $section => $v);
        $returnArray = array_merge_recursive($returnArray, $v);
      }
      else
      {
        $returnArray[$section][$k] = $v;
      }
    }
  }
  return $returnArray;
}

2 respuestas a “parse_ini_file() con arrays de gran profundidad | advanced_parse_ini_file()”

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *