12
votes

Analyser un fichier ini "avancé" avec PHP

Fondamentalement, j'aimerais que j'aimerais un moyen simple, simple et unique d'analyser un fichier INI avec des fonctionnalités "avancées", telles que héritage de section et nichement de propriété, comme zend_config_ini .

Par exemple: p> xxx pré>

dans P>

array(
  'foo'=>array(
    'a'=>'1',
    'b'=>array(
      'a'=>'2',
      'b'=>'3',
      'c'=>'4'
    ),
    'c'=>'5'
  ),
  'bar'=>array(
    'a'=>'1',
    'b'=>array(
      'a'=>'2',
      'b'=>'17',
      'c'=>'4'
    ),
    'c'=>'42'
  )
)


6 commentaires

Pouvez-vous expliquer pourquoi zend_config_ * est "super gonflé"? Oh, et vous n'avez pas besoin de tout le arbre ... Just Zend_config, Zend_Config_Exception et Zend_Exception


En regardant via le fichier source, Zend_Config_ini dépend de Zend_Config_Exception et de Zend_Config. Zend_Config_Exception dépend de Zend_Exception. Toutes les fonctionnalités sont étalées sur plusieurs classes et fichiers. Accordé, je tiens zf dans très hautement respecté pour sa conception de l'OOP, mais dans ce cas, c'est vraiment trop.


Tout ce que je veux que ce soit à faire est d'analyser une ini à un tableau associatif. Je ne veux pas ou si vous avez besoin de la fonctionnalité supplémentaire que Zend_Config a.


Votre choix si vous voulez le faire de la manière difficile :) Bien que vous puissiez faire des mods mineurs à Zend_Config_ini pour supprimer les dépendances.


J'avais peur de ça ... merci pour le conseil, Jani.


Je n'appellerais pas zend_config ballonné. Bloté implique une surfonctionnalité, ce qui implique à son tour la fonctionnalité. Nous parlons de Zend "Créer votre propre implémentation de l'ACL!" Cadre ici.


4 Réponses :


3
votes

Première pour répondre à une chose, la nidification de la propriété est disponible à partir de parse_ini_file (), définissez le deuxième param param w sur true I.e parse_ini_file ("test.ini", true); Cela vous donnera une matrice multidimensionnelle, c'est-à-dire xxx pré>

Voici une petite fonction qui analysera la matrice renvoyée par parse_ini_file () et la transformer en catégories. P>

Array
(
    [foo] => Array
        (
            [a] => 1
            [b.a] => 2
            [b.b] => 3
            [b.c] => 4
            [c] => 5
        )

    [bar] => Array
        (
            [a] => 1
            [b.a] => 2
            [b.b] => 17
            [b.c] => 4
            [c] => 42
        )
)


1 commentaires

Eh bien, ce que vous appelez la nidification de la propriété, c'est juste des sections ( [foo] ou [foo: bar] ). Votre fonction gère la section héritage de la section (très bien, aussi, j'ajouterais), mais pas la propriété de propriété comme je veux dire: BA = 5 devrait générer [B] => tableau ([A] = > 5) .



16
votes

Je ne sais pas si je devrais éditer ma vieille réponse ou ajouter un nouveau.

Essayez cette version de celui-ci, devrait être ce que vous recherchez. P>

Array
(
[foo] => Array
    (
        [a] => 1
        [b] => Array
            (
                [a] => 2
                [b] => 3
                [c] => 4
            )

        [c] => 5
    )

[bar] => Array
    (
        [a] => 1
        [b] => Array
            (
                [a] => 2
                [b] => 17
                [c] => 4
                [x] => Array
                    (
                        [c] => 33
                    )

            )

        [c] => 42
    )

[hot] => Array
    (
        [a] => 1
        [b] => Array
            (
                [a] => 83
                [b] => 17
                [c] => 4
                [x] => Array
                    (
                        [c] => 33
                    )

                [d] => 23
            )

        [c] => 42
    )
)


2 commentaires

Hey, merci! C'est exactement ce que je cherche. En aucun cas, j'aurais pu trouver cela si concis. Pour une référence future, étant donné que c'est un amendement à votre autre réponse, vous devez le modifier.


Je sais que c'est un ancien poste mais toujours utile, bien qu'il y ait une erreur avec la fonction récursive_parse. Dans la 2e foreach, après la première boucle $ b = tableau ($ v => $ b); $ b ne sera pas défini. et si $ B n'est pas défini, la fusion récursive échouera sur $ b [$ x [0]]



0
votes

J'ai écrit quelque chose comme ça et pour l'instant, cela fonctionne bien pour moi: XXX


0 commentaires

0
votes

Une autre option - c'est la paire, la construction et l'analyse.

function build_ini_string_nested( $data, $path = null ){
  $content = array();
  foreach( $data AS $key => $val ){
    if( is_array($val) ){
      $content[] = build_ini_string_nested( $val, ($path ? $path. '.' : '') . $key );
    }
    else if( $path ) {
      $content[] = $path . '[' . ($path && is_numeric($key) ? '' : $key) . '] = ' . $val;
    }
    else {
      $content[] = $key . ' = ' . $val;
    }
  }
  return implode("\n", $content);
}

function parse_ini_string_nested( $data, $path = null ){
  if( is_string($data) )
    $data = parse_ini_string($data);
  if( $path )
    foreach( $data AS $key => $val ){
      if( strpos( $key, $path.'.' ) !== false ){
        $find_node = explode('.', $path);
        $this_path = reset(explode('.', substr($key, strlen($path.'.'))));
        $node =& $data;
        do {
          $node =& $node[ array_shift($find_node) ];
        } while( count($find_node) );
        if( is_array($node[ $this_path ]) ){
          $node[ $this_path ][] = $val;
        }
        else {
          $node[ $this_path ] = $val;
        }
      }
    }
  else {
    $drop_keys = array();
    foreach( $data AS $key => $val ){
      if( count(explode('.', $key)) > 1 ){
        $path = reset(explode('.', $key));
        $data[ $path ] = array();
        $data = parse_ini_string_nested( $data, $path );
        $drop_keys[] = $key;
      }
    }
    foreach( $drop_keys AS $key ){
      unset($data[ $key ]);
    }
  }
  return $data;
}


0 commentaires