Php 解析一个奇怪的格式错误的ini
我有一个非常坏/奇怪的INI文件,看起来像 如果可能的话,以Php 解析一个奇怪的格式错误的ini,php,ini,Php,Ini,我有一个非常坏/奇怪的INI文件,看起来像 如果可能的话,以 array("11668" => array("name"=> "SCNA DaCe", "relation"=>"Family", "ppa"=>true)); 换行符是根据RowID而不是正确的[section]来分隔的,我不知道该怎么读,从哪里开始有什么提示吗 有不一致的大小写,某些东西没有值(比如一行中的PPA),并不是所有的key=vals都是为每种情况定义的。您必须使用自己的自定义解决方案来解析这
array("11668" => array("name"=> "SCNA DaCe", "relation"=>"Family", "ppa"=>true));
换行符是根据RowID
而不是正确的[section]
来分隔的,我不知道该怎么读,从哪里开始有什么提示吗
有不一致的大小写,某些东西没有值(比如一行中的
PPA
),并不是所有的key=vals
都是为每种情况定义的。您必须使用自己的自定义解决方案来解析这个INI文件,因为PHP的内置是基于PHP自己的PHP.INI格式约束的。所以它必须是有效的PHP
出于您的目的,如果要求像每行上的键/值对一样简单,除了作为默认布尔值true的一次性绞合值,那么您可以执行以下操作
function my_parse_ini($ini_file_name) {
$ini = file($ini_file_name, FILE_IGNORE_NEW_LINES);
$return = array();
$row = null;
foreach ($ini as $key => $value) {
if ($value == '') {
$row = null;
continue;
}
@list($k, $v) = explode('=',$value);
if ($v === null) {
$v = true;
}
if ($row === null) {
$row = $v;
$return[$row] = array();
continue;
}
$return[$row][$k] = $v;
}
return $return;
}
/* usage */
var_dump(my_parse_ini('test.ini'));
这将为您的示例ini文件输出以下内容
array(2) {
[11668]=>
array(4) {
["Name"]=>
string(3) "PCA"
["PPA"]=>
bool(true)
["Relation"]=>
string(6) "Family"
["RowID"]=>
string(5) "31999"
}
[11593]=>
array(2) {
["Name"]=>
string(8) "CRMLEVEL"
["Relation"]=>
string(6) "Family"
}
}
对于类似的东西,一组对象就很方便了
RowID=31999应该是它自己的数组,名称为PCA。这是一个问题,到处都有不一致的地方:(在这一点上,我有点考虑尝试将RowID=*正则化为[*],并尝试以这种方式解析它。您声明换行符分隔RowID。您没有提到RowID不带前导换行符的可能性。
array(2) {
[11668]=>
array(4) {
["Name"]=>
string(3) "PCA"
["PPA"]=>
bool(true)
["Relation"]=>
string(6) "Family"
["RowID"]=>
string(5) "31999"
}
[11593]=>
array(2) {
["Name"]=>
string(8) "CRMLEVEL"
["Relation"]=>
string(6) "Family"
}
}
<?php // RAY_temp_dylan.php
error_reporting(E_ALL);
echo '<pre>';
$str = <<<END
RowID=11668
Name=SCNA DaCe
PPA
Relation=Family
RowID=31999
Name=PCA
RowID=11593
Name=CRMLEVEL
Relation=Family
END;
// SIMULATE READING WITH file()
$arr = explode(PHP_EOL, $str);
// COLLECT THE NORMALIZED DATA HERE
$out = array();
$obj = new stdClass;
// USE AN ITERATOR ON EACH ROW
foreach ($arr as $row)
{
// SKIP BLANK LINES
$row = trim($row);
if (empty($row)) continue;
// FOR EACH ROWID CREATE A NEW OBJECT
if (FALSE !== strpos($row, 'RowID'))
{
// SAVE THE OLD OBJECT
$out[] = $obj;
$obj = new stdClass;
$obj->RowID = end(explode('=', $row));
}
// FOR REMAINING ELEMENTS THAT ARE KEY-VALUE PAIRS
if (FALSE !== strpos($row, '='))
{
$key = current(explode('=', $row));
$val = end(explode('=', $row));
$obj->$key = $val;
}
// FOR REMAINING ELEMENTS THAT ARE NOT KEY-VALUE PAIRS
else
{
$obj->$row = TRUE;
}
}
// SAVE LAST ELEMENT AT EOF
$out[] = $obj;
// DISCARD THE ZERO "STARTER" ELEMENT
unset($out[0]);
var_dump($out);