我想使用像[parse_ini_file] [1]这样的东西。
让我们说比如我有一个boot.ini文件,我将加载该文件以进一步执行:
;database connection settings
[database]
type = mysql;
host = localhost;
username = root;
password = "";
dbName = wit;
但是,我想以不同的方式使用它,因为php数组将是:
$ini['database']['whatever']
首先,我想让我的boot.ini像这样的结构:
;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;
所以,当我现在访问该文件时,我想以这种方式访问它:
$ini['db']['host1']['whatever']
最重要的是,我想通过OOP来做,所以让我们说: $ ini-> DB-> host1->任何
or `$ini->db->host1`
将返回一个包含所有属性的数组,例如type,host,username,password和dbName;
我感谢任何帮助。非常感谢你提前。
[1]: http://uk2.php.net/manual/en/function.parse-ini-file.php
答案 0 :(得分:4)
那么,您需要对parse_ini_file结果数组进行后处理。
$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;
}
更新 Hackety-Hack。现在使用额外的$prev
再次取消设置最后一个对象级别。 (用于检测最后一个$ key的for循环会更好)。
如果要使用数组语法和对象语法,请将new stdclass
替换为new ArrayObject(array(), 2);
。
答案 1 :(得分:3)
$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);
答案 2 :(得分:0)
我为您提供了一个优雅的解决方案。这个实现允许继承和使用点的向量,因为我们的同事“zerkms”之前向我们展示过。事实上,我采取了他的解决方案并改进了它。因此解决方案就像Zend Parser :)我测试了它并且有效。但是,正如我们所知,不可能测试所有可能性。然后,我希望看到人们发现麻烦并提出更正。
这里是代码(作为函数):
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;
}
这是一个.ini文件的例子:
[环境]
env_name =生产
x.y = 3
[oi:environment]
z = 5