【问题标题】:Maintain all values of duplicate keys when parsing .ini file解析 .ini 文件时保持所有重复键的值
【发布时间】:2018-05-28 22:27:29
【问题描述】:

我有一个php.ini 文件,其中包含以下几行:

; ...settings

extension=pdo_mysql
extension=pdo_oci

; settings...

所以我这样做:

var_dump( parse_ini_file( '/path/to/php.ini' )[ 'extension' ] );

但我得到的只是string(7) "pdo_oci",所以看起来解析只是维护了extension设置为的最终值。

有没有办法让extension 键返回一个数组?

我了解 PHP 的内部可能使用专用解析器来显式处理这种情况,以便扩展正确加载,但这并不能帮助我实现目标。

【问题讨论】:

    标签: php parsing ini


    【解决方案1】:

    由于 ini 文件的键成为数组的键,因此值被覆盖。我想出了自己的功能。

    代码:

    function my_parse_ini($file){
        $arr = array();
        $handle = fopen($file, "r");
        if ($handle) {
            while (($line = fgets($handle)) !== false) {
                $parsed = parse_ini_string($line);
                if(empty($parsed)){ continue; }
                $key = key($parsed);
                if(isset($arr[$key])){
                    if(!is_array($arr[$key])){
                        $tmp = $arr[$key];
                        $arr[$key] = array($tmp);
                    }
                    $arr[$key][] = $parsed[$key];
                }else{
                    $arr[$key] = $parsed[$key];
                }
            }
            fclose($handle);
            return $arr;
        } else {
            // error opening the file.
        } 
    }
    

    调用它传递要解析的文件,像这样:

    $parsed = my_parse_ini('/path/to/php.ini');
    

    结果: ($parsed)

    对于包含

    的文件
    ; ...settings
    
    extension=pdo_mysql
    extension=pdo_oci
    
    foo=test
    bar=ok
    foo=teste1
    ; settings...
    

    这是输出:

    Array
    (
        [extension] => Array
            (
                [0] => pdo_mysql
                [1] => pdo_oci
            )
    
        [foo] => Array
            (
                [0] => test
                [1] => teste1
            )
    
        [bar] => ok
    )
    

    【讨论】:

    • 我查看了您的代码,它看起来很有希望,但我必须去开会,所以我稍后会对其进行测试。谢谢!
    • 是的,没问题。我在本地测试过,但你测试后会更好。 @MonkeyZeus
    • 终于有机会测试了,我很喜欢,谢谢!
    • @MonkeyZeus 我很高兴能帮上忙 :)
    猜你喜欢
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 2017-06-01
    • 2015-08-09
    • 1970-01-01
    • 2019-03-09
    • 2016-11-11
    • 2010-09-29
    相关资源
    最近更新 更多