解析“高级”INI文件用PHP

基本上,我想了一个简单,易行,一个文件的方式来解析INI文件,“高级”的功能,如部分继承和财产筑巢一样Zend_Config_Ini中使用。

例如:

[foo] a = 1 ba = 2 bb = 3 bc = 4 c = 5 [bar : foo] bb = 17 c = 42

将会解析成

array( 'foo'=>array( 'a'=>'1', 'b'=>array( 'a'=>'2', 'b'=>'3', 'c'=>'4' ), 'c'=>'5' ), 'bar'=>array( 'a'=>'1', 'b'=>array( 'a'=>'2', 'b'=>'17', 'c'=>'4' ), 'c'=>'42' ) )

PHP的内置parse_ini_file不处理任何事情比简单的INI的简单的部分,简单的按键等。

我的问题与使用Zend_Config_Ini的是,我将不得不包括几乎整个Zend_Config的分装,而且是超臃肿和配置。

一个小而简单的库可用来分析呢?
如果不是, 一个简单的实现,我没有看到?

通过小而简单,我的意思是这样sfYaml INI的文件。

在我(非常缺乏经验)的眼睛,我将不得不通过解析一次parse_ini_file然后回来解决继承,再通过各部分运行,递归扩展键...

更新:由于这似乎是一个普遍的问题,我想指出,我有一个简单的类在GitHub上实现这一点,随时发送拉动需求,疑问等。

--------------解决方案-------------

不知道我是否应该修改我的旧的答案或添加一个新的。

试试这个版本吧,应该是你要找的内容。

function parse_ini_advanced($array) {
$returnArray = array();
if (is_array($array)) {
foreach ($array as $key => $value) {
$e = explode(':', $key);
if (!empty($e[1])) {
$x = array();
foreach ($e as $tk => $tv) {
$x[$tk] = trim($tv);
}
$x = array_reverse($x, true);
foreach ($x as $k => $v) {
$c = $x[0];
if (empty($returnArray[$c])) {
$returnArray[$c] = array();
}
if (isset($returnArray[$x[1]])) {
$returnArray[$c] = array_merge($returnArray[$c], $returnArray[$x[1]]);
}
if ($k === 0) {
$returnArray[$c] = array_merge($returnArray[$c], $array[$key]);
}
}
} else {
$returnArray[$key] = $array[$key];
}
}
}
return $returnArray;
}
function recursive_parse($array)
{
$returnArray = array();
if (is_array($array)) {
foreach ($array as $key => $value) {
if (is_array($value)) {
$array[$key] = recursive_parse($value);
}
$x = explode('.', $key);
if (!empty($x[1])) {
$x = array_reverse($x, true);
if (isset($returnArray[$key])) {
unset($returnArray[$key]);
}
if (!isset($returnArray[$x[0]])) {
$returnArray[$x[0]] = array();
}
$first = true;
foreach ($x as $k => $v) {
if ($first === true) {
$b = $array[$key];
$first = false;
}
$b = array($v => $b);
}
$returnArray[$x[0]] = array_merge_recursive($returnArray[$x[0]], $b[$x[0]]);
} else {
$returnArray[$key] = $array[$key];
}
}
}
return $returnArray;
}

会被称为是这样的:

$array = parse_ini_file('test.ini', true);
$array = recursive_parse(parse_ini_advanced($array));

这可能是做了很多更好/更清晰的,但对于一个简单的解决方案,它应该只是罚款。

如果你的配置是:

[foo]
a = 1
ba = 2
bb = 3
bc = 4
c = 5

[bar : foo]
bxc = 33
bb = 17
c = 42

[hot : bar : foo]
ba = 83
bd = 23

输出应该是:

Array
(
[foo] => Array
(
[a] => 1
[b] => Array
(
[a] => 2
[b] => 3
[c] => 4
)

[c] => 5
)

[bar] => Array
(
[a] => 1
[b] => Array
(
[a] => 2
[b] => 17
[c] => 4
[x] => Array
(
[c] => 33
)

)

[c] => 42
)

[hot] => Array
(
[a] => 1
[b] => Array
(
[a] => 83
[b] => 17
[c] => 4
[x] => Array
(
[c] => 33
)

[d] => 23
)

[c] => 42
)
)

首先要回答的一件事,财产嵌套是parse_ini_file()即时拍摄,设置第二个参数为true,即parse_ini_file('test.ini“,真正的); 这会给你一个多维数组,即

Array
(
[foo] => Array
(
[a] => 1
[ba] => 2
[bb] => 3
[bc] => 4
[c] => 5
)

[bar : foo] => Array
(
[bb] => 17
[c] => 42
)
)

这里是一个小功能,将解析()由parse_ini_file返回的数组,并把它变成类别。

/**
* Parse INI files Advanced
* process_sections = true
* scanner_mode = default
*
* Supports section inheritance
* and has property nesting turned on
*
* @param string $filename
* return array
*/
function parse_ini_file_advanced($filename) {
$array = parse_ini_file($filename, true);
$returnArray = array();
if (is_array($array)) {
foreach ($array as $key => $value) {
$x = explode(':', $key);
if (!empty($x[1])) {
$x = array_reverse($x, true);
foreach ($x as $k => $v) {
$i = trim($x[0]);
$v = trim($v);
if (empty($returnArray[$i])) {
$returnArray[$i] = array();
}
if (isset($array[$v])) {
$returnArray[$i] = array_merge($returnArray[$i], $array[$v]);
}
if ($k === 0) {
$returnArray[$i] = array_merge($returnArray[$i], $array[$key]);
}
}
} else {
$returnArray[$key] = $array[$key];
}
}
} else {
return false;
}

return $returnArray;
}

它将返回这一点:

Array
(
[foo] => Array
(
[a] => 1
[ba] => 2
[bb] => 3
[bc] => 4
[c] => 5
)

[bar] => Array
(
[a] => 1
[ba] => 2
[bb] => 17
[bc] => 4
[c] => 42
)
)

最后写胜即
[BAR2:foo2的:巴:FOO]
BAR2赢得与它在它自己的阵列设置
注:其他3阵列将在那里到这一点。

希望这是你所期待的。

我已经写了这样的事情,现在来看它的工作确定为我:

$config = array();
$configSrc = parse_ini_file( $filePath, true );
foreach( $configSrc as $sectionName => $section )
{
$config[$sectionName] = array();
foreach( $section as $itemName => $item )
{
$itemNameArray = explode( '.', $itemName );
eval( sprintf('$config[$sectionName][\'%s\'] = $item;', join("']['", $itemNameArray)) );
}
}

// marge inheritance;
foreach( $config as $sectionName => $section )
{
$ancestryArray = explode( ':', $sectionName );
$ancestryCount = count( $ancestryArray );
if( $ancestryCount > 1 )
{ //
$config[$sectionNameTrimmed = trim($ancestryArray[0])] = array();
$ancestryArray = array_reverse( array_slice($ancestryArray, 1) );
foreach( $ancestryArray as $ancestryName )
{
$ancestryName = trim( $ancestryName );
if( isset($config[$ancestryName]) ) {
$config[$sectionNameTrimmed] = array_replace_recursive( $config[$sectionNameTrimmed], $config[$ancestryName] );
}
}

$config[$sectionNameTrimmed] = array_replace_recursive( $config[$sectionNameTrimmed], $section );
unset( $config[$sectionName] );
}

}

分类:php 时间:2012-01-01 人气:2
本文关键词: PHP,分析,INI
分享到:

相关文章

  • 正则表达式读取INI用PHP 2012-12-19

    示例ini文件是 [SAMPLE.jpg] faces=rect64(c18f4c8ef407851e),d4ff0a020be5c3c0;rect64(534a06d429ae627),dff6163dfd9d4e41;rect64(b9c100fae46b3046),e1059dcf6672a2b3;rect64(7b5105daac3a3cf4),4fc7332c107ffafc;rect64(42a036a27062a6c),ef86c3326c143248;rect64(31f4efe

  • PHP是否允许* .properties文件在Java中? 2012-02-08

    有你在Java中做使用* .properties文件在PHP的方法吗? 我想存储在属性或XML文件中的一些应用程序级的常数,很容易从整个我的代码调用它们. 您的指导大加赞赏. 谢谢. --------------解决方案------------- PHP可以本地加载和分析.ini使用文件parse_ini_file() 您也可以通过设置常量包含文件中define() 如果你在XML设置,看看PHP的XML功能. 最简单的解决办法可能是使用的SimpleXML. 您还可以使用包含数组存储数据的PH

  • 批处理文件:如何读取文件? 2012-12-27

    你怎么可以读取一个批处理文件的文件(文本或二进制)? 有一种方法来读取它以二进制方式或文本模式? --------------解决方案------------- 您可以使用的命令: FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k 类型 for /? 在命令提示符下. 此外,您还可以分析INI文件! 在NT风格的cmd.exe,你可以通过一个文本文件与线环 FOR /F %i IN (fi

  • 如何使用初始化文件,环境和/或命令行的C程序? 2013-10-04

    在C语言中,如何配置初始设置一些程序,用键 - 值对,与任何或全部的:一个纯文本的配置文件,环境变量和选项在命令行上. 另外,如何决定哪种方法的值将覆盖那些从其它两个的. 然后,如果值已被改变,可选地更新配置文件. 什么是做到这一点的最简单方法,而如果有的话,是最接受的方法呢? 是否有一个,最好是小的,开放源码的程序,给出了如何可以做到这一点的好例子? --------------解决方案------------- 基础: 要使用环境变量来配置程序,您可以使用stdlib.h中定义了getenv

  • PHP和C之间共享配置文件 2014-02-22

    我写一个应用程序,是一个部分PHP和一个C部分的两件将通过套接字交谈. 作为协议的IPC的一部分,应用程序将依靠"信息型"字节. 例如,如果数据块的第一个字节是1,那么剩下的装置类似的东西显示系统信息等. 在C头文件,我可以这样定义这些消息类型... #define GET_SYSTEM_INFO 0x1 #define SET_SECURITY_LEVEL 0x2 etc 我真的很喜欢它,如果我能在是PHP部分以及C应用程序之间共享一个文件中定义这些值. 通过这种方式,他们正在关闭一

  • PHP INI分析错误 2013-07-23

    我得到的ini解析错误以下ini文件: [photo] price = 5.00 [shipping] South Africa[value] = 50.00 South Africa[incremental] = 100 Pakistan[value] = 120.00 Pakistan[incremental] = 100 [discount] min[quantity] = 50 min[value] = 5 max[quantity] = 150 max[value] = 10 [adm

  • 如何防止使用的.htaccess或自定义的php.ini覆盖设置 2012-01-01

    如何确保使用.htaccess中的用户不能覆盖该设置或自定义php.ini中的配置,我应该用什么秘诀 --------------解决方案------------- 为了防止用户在设置.htaccess文件PHP配置值,不给AllowOverride Options对他们的虚拟主机的权限. 另外,安装PHP作为CGI而不是作为一个Apache模块,CGI版本是.htaccess文件的影响. 然而,由于PHP 5.3.0,PHP CGI并分析每个目录的php.ini文件. 我不知道,原来这关的方法

  • 正在解析PHP中的ini文件不必在代码中定义的变量更好? 2012-01-18

    我正在阅读有关PDO和我穿过parse_ini_file函数来了. 使用此功能以dB为单位设置,而不是硬编码数据库设置代码出于安全原因来分析提出了一些开发人员. 我对你的问题是,是否有意义做阅读这个额外的"安全"您的PHP应用程序的每个加载一个文件? 我不知道这个文件的读有多贵.. PHP 5.3中的注释http://www.php.net/manual/en/class.pdo.php --------------解决方案------------- 我实在不明白它是如何的更安全. 例

  • 阅读简单的INI文件,AS3 2012-01-31

    我应该使用什么AS3类来读取一个简单的属性/ ini文件到内存配置一些设置,如颜色容易项目. 格式可以是 key=value <newline> 我喜欢用这种API的访问:跟踪(Settings.get("钥匙")) --------------解决方案------------- 没有内置的方式做到这一点在AS3,但我们有加载和分析在Spring ActionScript属性文件的支持. 这里是直接链接到源: 性能 PropertiesParser(内部使用属性) 我可以选

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.353 (s). 10 q(s)