基本上,我想要一个简单,简单,单文件的方法来解析具有"高级"功能的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
Run Code Online (Sandbox Code Playgroud)
会解析
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'
)
)
Run Code Online (Sandbox Code Playgroud)
PHP的内置功能parse_ini_file
除了简单的部分和简单的键之外,不会处理简单的INI.
我使用的问题Zend_Config_Ini
是我必须包含几乎整个Zend_Config子包,并且是超级膨胀和可配置的.
是否有一个小而简单的库可以解析它?
如果没有,是否有一个我没有看到的简单实现?
小而简单,我的意思是像INI文件的sfYaml.
我的(非常缺乏经验)的眼睛,我将不得不通过与一次解析parse_ini_file
,然后回来解决继承,然后通过各部分运行和递归扩展键...
更新:由于这似乎是一个流行的问题,我想指出,我有一个简单的类GitHub上实现这个,随时发送引入请求,问题等.
Vip*_*_Sb 16
不确定我是否应该编辑旧答案或添加新答案.
尝试这个版本,应该是你正在寻找的.
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;
}
Run Code Online (Sandbox Code Playgroud)
将被称为这样:
$array = parse_ini_file('test.ini', true);
$array = recursive_parse(parse_ini_advanced($array));
Run Code Online (Sandbox Code Playgroud)
这可以做得更好/更清楚,但对于一个简单的解决方案,它应该工作得很好.
如果您的配置是:
[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
Run Code Online (Sandbox Code Playgroud)
输出应该是:
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
)
)
Run Code Online (Sandbox Code Playgroud)