【问题标题】:How to parse ini file with duplicate sections in PHP如何在 PHP 中解析具有重复部分的 ini 文件
【发布时间】:2015-08-09 13:52:36
【问题描述】:

我有一个看起来像这样的ini文件:

[account]
user= saas
pwd=di1Z-ARMfKF2
description= as
expdate= 2015-08-22
caid = 1702,1830,0B00,0D95,0500,0648,0B02,09C7,1722,1834,098C
betatunnel= 1834.FFFF:1722,1833.FFFF:1702
group= 1,2,3,4,5,6,7,8,9,30
cccmaxhops= 5
cccreshare= 0

[account]
user= sdadsa
pwd= XnbawAH/ZYRP
description= sdasda
expdate= 2016-08-13
caid= 1702,1830,0B00,0D95,0500,0648,0B02,09C7,1722,1834,098C
betatunnel= 1834.FFFF:1722,1833.FFFF:1702
group= 1,2,3,4,5,6,7,8,9,30
cccmaxhops= 5
cccreshare= 0

例如,我需要查找描述为“sdasda”的“用户”的内容。 我试过了:

<?php
$accounts = [];
$accountIniArr = explode('[account]',   file_get_contents('oscam.user')); 
foreach ($accountIniArr as $accIni) 
{ 
$account = parse_ini_string($accIni); 
$accounts[$acc['user']] = $account; 
}
echo $accounts['sdadsa']['description'];
?>

不起作用,似乎数组没有被正确解析,知道如何解决吗?

【问题讨论】:

  • $ini_array 是什么样的?我很确定你不能像这样使用parse_ini_file();重复的章节标题会被覆盖。您应该改用数据库。
  • 嗯,看来你是对的。知道如何像我上面描述的那样解析文件吗?
  • 您必须手动解析它。使用数据库:-)
  • 不行,我需要从上面的文件中解析。该软件不支持存储用户数据的数据库。
  • [account] 上爆炸然后在\n 上爆炸。

标签: php arrays parsing ini


【解决方案1】:

从 cmets 中的讨论开始,您不能使用具有相同名称的 ini 部分,因此要使用该 ini 格式,您必须进行一些自定义解析。以下是 chris85 和 Mark baker 的意思示例:

$accounts = [];

// Read the .ini file contents, and explode it by the section identifier
$accountIniArr = explode('[account]', file_get_contents('users.user'));

// Iterate through the resultant array, and parse each of the user account 
// .ini settings, storing them in a multi-dimensional array as you go
for ($i=1; $i<count($accountIniArr); $i++)
{
    $accountIni = $accountIniArr[$i];
    $account = parse_ini_string($accountIni);
    $accounts[$account['user']] = $account;
}

这将生成一个包含所有帐户的多维数组,第一个索引是user 字段。要使用您发布的示例数据,数组将是:

[
 saas => [
  user => saas,
  pwd => di1Z-ARMfKF2,
  description => as,
  expdate => 2015-08-22,
  caid => 1702,1830,0B00,0D95,0500,0648,0B02,09C7,1722,1834,098C,
  betatunnel => 1834.FFFF:1722,1833.FFFF:1702,
  group => 1,2,3,4,5,6,7,8,9,30,
  cccmaxhops => 5,
  cccreshare => 0
 ],
 sdadsa => [
  user => sdadsa,
  pwd => XnbawAH/ZYRP,
  description => sdasda,
  expdate => 2016-08-13,
  caid => 1702,1830,0B00,0D95,0500,0648,0B02,09C7,1722,1834,098C,
  betatunnel => 1834.FFFF:1722,1833.FFFF:1702,
  group => 1,2,3,4,5,6,7,8,9,30,
  cccmaxhops => 5,
  cccreshare => 0
 ]
]

但是,您也可以将用户名放入 ini 文件的部分标题中,而不是 account

【讨论】:

  • 如何获取例如用户“sdadsa”的字段“描述”?我试过这个 echo $accounts['sdadsa'['description']];
  • @dehniz 与任何其他多维数组一样,即$accounts['sdadsa']['description']
  • 我编辑了上面的代码,是否需要使用“array_search”来查找描述字段的值,其中user=sdasda?用户名是“sdadsa”,希望你明白我的意思。
  • @dehniz 在我的回答中查看更新的代码 sn-p; for 循环实际上应该从数组位置 1 而不是 0 开始(数组中的第一个元素是空的)并且有一个错字。我做了一个快速的单元测试,现在一切都很好。
猜你喜欢
  • 2012-10-12
  • 2016-04-10
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 2018-05-28
相关资源
最近更新 更多