用PHP解析“高级”INI文件

前端之家收集整理的这篇文章主要介绍了用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
    )
)

猜你在找的PHP相关文章