代码之家  ›  专栏  ›  技术社区  ›  MonkeyZeus

解析时维护重复键的所有值。ini文件

  •  1
  • MonkeyZeus  · 技术社区  · 7 年前

    我有一个 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 已设置为。

    有没有办法 扩大 键返回数组?

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   FirstOne    7 年前

    由于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
    )