php parse_ini_file oop & deep

Gostaria de usar alguém como [parse_ini_file] [1].

Digamos, por exemplo, que eu tenho um arquivo boot.ini que irei carregar para o procedimento adicional:

;database connection settings [database] type = mysql; host = localhost; username = root; password = ""; dbName = wit; 

No entanto, eu gostaria de tê-lo de uma maneira diferente, pois a matriz php seria:

 $ini['database']['whatever'] 

Então, antes de tudo, eu gostaria de ter meu boot.ini como essa estrutura:

 ;database settings (comment same style) db.host1.type = mysql; db.host1.host = localhost; db.host1.username = root; db.host1.password = ""; db.host1.dbName = wit; db.host2.type = mysql; db.host2.host = otherHost; db.host2.username = root; db.host2.password = ""; db.host2.dbName = wit; 

Então, quando eu agora acessar o arquivo, eu gostaria de acessá-lo desta forma:

 $ini['db']['host1']['whatever'] 

E, além disso, eu gostaria de fazer isso via OOP, então digamos: $ ini-> db-> host1-> o que quer que seja

 or `$ini->db->host1` 

irá retornar uma matriz com todos os atributos, como tipo, host, nome de usuário, senha e dbName;

Agradeço qualquer ajuda. Muito obrigado antecipadamente.

  [1]: http://uk2.php.net/manual/en/function.parse-ini-file.php 

Bem, você precisa pós-processamento da matriz de resultados parse_ini_file então.

 $ini_array = parse_ini_file("bootstrap.ini"); $ini = new stdclass; foreach ($ini_array as $key=>$value) { $c = $ini; foreach (explode(".", $key) as $key) { if (!isset($c->$key)) { $c->$key = new stdclass; } $prev = $c; $c = $c->$key; } $prev->$key = $value; } 

Atualize Hackety-Hack. Agora, usando um extra $prev para desarmar novamente o último nível de object. (Um loop para detectar a última $ key teria funcionado melhor).

Se você deseja usar a syntax da matriz e a syntax do object, substitua a new stdclass com o new ArrayObject(array(), 2); .

 $ini_array = parse_ini_file("sample.ini"); $ini = new stdclass; foreach ($ini_array as $key => $value) { $last = substr(strrchr($key, '.'), 1); if (!$last) $last = $key; $node = $ini; foreach (explode('.', $key) as $key2) { if (!isset($node->$key2)) { $node->$key2 = new stdclass; } if ($key2 == $last) { $node->$key2 = $value; } else { $node = $node->$key2; } } } var_dump($ini->db->host1->type); 

Eu tenho uma solução elegante para você. Esta implementação permite inheritance e vetores usando pontos como nosso colégio “zerkms” nos mostrou antes. Na verdade, tomei a solução e a aperfeiçoei. Assim, a solução é como Zend Parser 🙂 Eu testei e funciona. Mas, como sabemos, é impossível testar todas as possibilidades. Então, espero que pessoas experientes detectem problemas e proponham correções.

Aqui vai o código (como uma function):

 function parse($filename) { $ini_array = parse_ini_file ( $filename, true ); if (! $ini_array) throw new Exception ( 'Error on parsing ini file!', - 1 ); $ini = new stdClass (); //Parse section... foreach ( $ini_array as $namespace => $prop ) { $section = $namespace; $ext = explode ( ':', $namespace ); if (count ( $ext ) == 2) { $section = trim ( $ext [0] ); $extend = trim ( $ext [1] ); if (! isset ( $ini->$extend )) throw new Exception ( 'Parent section doesn\'t exists!', - 1 ); $ini->$section = clone $ini->$extend; } else $ini->$section = new stdClass (); foreach ( $prop as $key => $value ) { $arr = explode ( '.', $key ); $n = count ( $arr ) - 1; if ($n) { $aux = $ini->$section; for($i = 0; $i < $n; ++ $i) { if(!isset($aux->$arr [$i])) $aux->$arr [$i] = new stdClass (); $aux = $aux->$arr [$i]; } $aux->$arr [$n] = $value; } else $ini->$section->$key = $value; } } return $ini; } 

E aqui é um exemplo de arquivo .ini:

[meio Ambiente]
env_name = produção
xy = 3

[oi: ambiente]
z = 5