用PHP解析“高级”INI文件
|
基本上,我想要一个简单,简单的单文件方式来解析具有“高级”功能的INI文件,如段继承和属性嵌套,如 Zend_Config_Ini. 例如: [foo] a = 1 b.a = 2 b.b = 3 b.c = 4 c = 5 [bar : foo] b.b = 17 c = 42 会解析 array(
'foo'=>array(
'a'=>'1','b'=>array(
'a'=>'2','b'=>'3','c'=>'4'
),'c'=>'5'
),'bar'=>array(
'a'=>'1','b'=>'17','c'=>'42'
)
)
PHP内置的parse_ini_file,除了简单的INI之外,还没有处理简单的部分和简单的键. 我使用Zend_Config_Ini的问题是,我必须包含几乎整个Zend_Config子包,并且是超级笨重和可配置的. 有一个小而简单的图书馆可以解析这个吗? 简单而言,我的意思是像INI文件的sfYaml. 对于我(非常缺乏经验)的眼睛,我将不得不用parse_ini_file解析一次,然后回来解决继承,然后遍历每个部分并递归地展开键… 更新:由于这似乎是一个受欢迎的问题,我想注意到,I have a simple class implementing this on GitHub,随时发送拉请求,问题等. 不知道我是否应该编辑我的旧答案或添加新的答案.尝试这个版本,应该是你要找的. function parse_ini_advanced($array) {
$returnArray = array();
if (is_array($array)) {
foreach ($array as $key => $value) {
$e = explode(':',$key);
if (!empty($e[1])) {
$x = array();
foreach ($e as $tk => $tv) {
$x[$tk] = trim($tv);
}
$x = array_reverse($x,true);
foreach ($x as $k => $v) {
$c = $x[0];
if (empty($returnArray[$c])) {
$returnArray[$c] = array();
}
if (isset($returnArray[$x[1]])) {
$returnArray[$c] = array_merge($returnArray[$c],$returnArray[$x[1]]);
}
if ($k === 0) {
$returnArray[$c] = array_merge($returnArray[$c],$array[$key]);
}
}
} else {
$returnArray[$key] = $array[$key];
}
}
}
return $returnArray;
}
function recursive_parse($array)
{
$returnArray = array();
if (is_array($array)) {
foreach ($array as $key => $value) {
if (is_array($value)) {
$array[$key] = recursive_parse($value);
}
$x = explode('.',$key);
if (!empty($x[1])) {
$x = array_reverse($x,true);
if (isset($returnArray[$key])) {
unset($returnArray[$key]);
}
if (!isset($returnArray[$x[0]])) {
$returnArray[$x[0]] = array();
}
$first = true;
foreach ($x as $k => $v) {
if ($first === true) {
$b = $array[$key];
$first = false;
}
$b = array($v => $b);
}
$returnArray[$x[0]] = array_merge_recursive($returnArray[$x[0]],$b[$x[0]]);
} else {
$returnArray[$key] = $array[$key];
}
}
}
return $returnArray;
}
会这样叫: $array = parse_ini_file('test.ini',true);
$array = recursive_parse(parse_ini_advanced($array));
这可以做得更好/更清晰,但是对于一个简单的解决方案,它应该工作正常. 如果你的配置是: [foo] a = 1 b.a = 2 b.b = 3 b.c = 4 c = 5 [bar : foo] b.x.c = 33 b.b = 17 c = 42 [hot : bar : foo] b.a = 83 b.d = 23 输出应为: 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
)
) (编辑:鄂州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
