基本上,我想要一个简单,简单的单文件方式来解析具有“高级”功能的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,随时发送拉请求,问题等.
不知道我是否应该编辑我的旧答案或添加新的答案.
原文链接:https://www.f2er.com/php/139857.html尝试这个版本,应该是你要找的.
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 ) )