解析 .ini 文件时保留重复键的所有值

Maintain all values of duplicate keys when parsing .ini file

我有一个 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 键 return 变成一个数组?

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

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