能否用PHP parse_ini_file函数解析多个INI文件并合并到单个变量?
把多个同结构INI文件解析到单个变量的解决办法
你原来的代码没达到预期,是因为每次循环都用新解析的INI数据直接覆盖了$whitelists变量,最后这个变量里只会保留最后一个文件的内容。下面给你两种可行的方案:
方案1:合并所有文件的键值对(键不重复时用)
如果所有INI文件里的键都不会重复,或者你希望后面文件的键自动覆盖前面的,就用数组合并的方式:
$whitelists = []; foreach (glob("./whitelist/*.conf") as $filename) { // 解析单个INI文件,加true参数可以解析带分段的INI(比如[xxx]开头的区块) $singleIni = parse_ini_file($filename, true); // 把当前文件的数据合并到总数组里 $whitelists = array_merge($whitelists, $singleIni); }
方案2:按文件名分组存储(键可能重复时用)
要是不同文件里有相同的键,又不想被覆盖,就把每个文件的数据按文件名作为单独的键存起来:
$whitelists = []; foreach (glob("./whitelist/*.conf") as $filename) { // 提取文件名(不带路径)作为分组键 $fileAlias = basename($filename); $whitelists[$fileAlias] = parse_ini_file($filename, true); }
额外说明
- 如果你用的INI文件没有分段(就是没有
[section]这种区块),可以去掉parse_ini_file的第二个参数true,直接写parse_ini_file($filename)就行。 - 要是需要递归遍历子文件夹里的INI文件,可以把
glob换成glob("./whitelist/**/*.conf", GLOB_BRACE)(PHP 5.3+支持)。
内容的提问来源于stack exchange,提问作者Peter Petky
相关产品推荐
相关产品推荐

