实战parse_ini_file()及扩展函数解析ini文件完整版

在PHP网站开发的过程中,往往会用到读取ini参数配置文件,比如需要访问一些复杂的借口,就可以直接在参数配置文件里面修改参数,然后再php脚本里面直接读取执行。而php有一个可以直接读取ini配置文件的函数parse_ini_file(),并以数组的形式返回。下面详细讲解一下采用PHP内置函数parse_ini_file,读取ini配置文件。

参数说明:array parse_ini_file ( string $filename [, bool $process_sections ] ) parse_ini_file() 载入一个由 filename 指定的 ini 文件,返回一个联合数组。如果将 process_sections 参数设为 TRUE,将得到一个多维数组,包括了配置文件中每一节的名称和设置。process_sections 的默认值是 FALSE,返回将每一节合并后的数组。ini文件注释用;符号

下面开始实例详解:

config.ini(可以设置为其它类型后缀名)如下:

; This is a sample configuration file
; Comments start with ';', as in php.ini

[first_section]
one = 1
five = 5
animal = BIRD

[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"

[third_section]
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"

PHP脚本测试代码,如下:

<?php
$ini_array = parse_ini_file("config.ini");
print_r($ini_array);

// Parse with sections
$ini_array = parse_ini_file("config.ini", true);
print_r($ini_array);

运行结果如下:

Array
(
[one] => 1
[five] => 5
[animal] => BIRD
[path] => /usr/local/bin
[URL] => http://www.9streets.cn
)
Array
(
[test] => Array
(
[one] => 1
[five] => 5
[animal] => BIRD
)

[beta] => Array
(
[path] => /usr/local/bin
[URL] => http://www.9streets.cn
)

)

parse_ini_file()函数,无法解析ini文件中的多维数组形式,这就需要自己手动加入下面的parse_ini_file_multi()方法,来解析大于三维数组的ini文件。特别说明的是,在PHP官网的手册中的parse_ini_file_multi()存在一个错误,下面代码中已经修复。

下面看一下parse_ini_file_multi()函数的实例详解!

parse_ini_file_multi()函数具体实现:

<?php
function parse_ini_file_multi($file, $process_sections = false, $scanner_mode = INI_SCANNER_NORMAL) {
$explode_str = '.';
$escape_char = "'";
// load ini file the normal way
$data = parse_ini_file($file, $process_sections, $scanner_mode);
if (!$process_sections) {
$data = array($data);
}
foreach ($data as $section_key => $section) {
// loop inside the section
foreach ($section as $key => $value) {
if (strpos($key, $explode_str)) {
if (substr($key, 0, 1) !== $escape_char) {
// key has a dot. Explode on it, then parse each subkeys
// and set value at the right place thanks to references
$sub_keys = explode($explode_str, $key);
$subs =& $data[$section_key];
foreach ($sub_keys as $sub_key) {
if (!isset($subs[$sub_key])) {
$subs[$sub_key] = '';
}
$subs =& $subs[$sub_key];
}
// set the value at the right place
$subs = $value;
// unset the dotted key, we don't need it anymore
unset($data[$section_key][$key]);
}
// we have escaped the key, so we keep dots as they are
else {
$new_key = trim($key, $escape_char);
$data[$section_key][$new_key] = $value;
unset($data[$section_key][$key]);
}
}
}
}
if (!$process_sections) {
$data = $data[0];
}
return $data;
}

file.ini文件如下:

[normal]
foo = bar
; use quotes to keep your key as it is
'foo.with.dots' = true

[array]
foo[] = 1
foo[] = 2

[dictionary]
foo[debug] = false
foo[path] = /some/path

[multi]
foo.data.config.debug = true
foo.data.password = 123456

php脚本文件如下:

<?php
$result = parse_ini_file_multi('file.ini', true);
print_r($result);

运行结果如下:

Array
(
[normal] => Array
(
[foo] => bar
[foo.with.dots] => 1
)
[array] => Array
(
[foo] => Array
(
[0] => 1
[1] => 2
)
)
[dictionary] => Array
(
[foo] => Array
(
[debug] =>
[path] => /some/path
)
)
[multi] => Array
(
[foo] => Array
(
[data] => Array
(
[config] => Array
(
[debug] => 1
)
[password] => 123456
)
)
)
)

到这里,已经详细叙述了 parse_ini_file()及其扩展函数的具体应用,不过在笔者程序开发的过程中,遇到了另一个难题,我需要把parse_ini_file()函数解析后的多维数组的键值对,放到接口的url中调用,这样的话,多维数组就出现了问题,即便可以实现效果也会面临非常臃肿的遍历过程。
在这里,笔者采用了另外一种方法,将ini配置文件中的多维数组的形式,均转化为一维数组,也就是“=”前面的变量,直接以类型数组样式的字符串赋值,“=”后面的值也就是多维数组的最终取值。
下面进行实例讲解,请注意笔者使用的方法注释!

test.ini配置文件如下

[API]

fields = id, title, total, url

phrase = iphone

//这里为什么要使用"<>",是因为"()"、"[]"、"{}",均为ini的关键字,只有"<>"可以在ini里面作为字符串显示,切记!
filter<title><like> = xx

filter<title><eq> = xx

filter<parent_id> = xx

filter<depth> = xx

php脚本程序如下:

$conf_data = parse_ini_file("config.ini", true);

//将解析后的数组键名中的"<>"替换为数组"[]"的形式,之后就可以在url在随意调用
foreach($conf_data['API'] as $key => $value){
if(substr_count($key,"<")){
$str = strtr($key,"<","[");
$str = strtr($str,">","]");
$conf_data['API'][$str] =$conf_data[''][$key];
unset($conf_data['Category_API'][$key]);
}
}
print_r($conf_data);

这种情况,往往只在需要url调用的时候用到!运行结果,试试便知,有问题可以评论回复,第一时间解决。
在实际开发过程中,还会用到json_encode()和json_decode()将字符串解析为数组,不再敖述!

原创文章,杜绝一切转载和复制,违者必究!!!

打赏此文

如果您觉得本站的内容对您有所帮助,您可以扫描下面的二维码小额支付请我喝杯茶,感谢!打赏记录
支付宝
微信
承诺:凡打赏捐助的朋友,留言备注自己的邮箱,在打赏捐助时间点的6个月内,本站会每周邮件推送原创专业技术博文,供大家学习和参考!

留下评论

All fields marked (*) are required