Как разобрать INI-файл с дубликатами разделов в PHP

1

У меня есть файл 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

Мне нужно найти, например, содержимое "user", где описание "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'];
?>

Не работает, похоже, что массив не обрабатывается правильно, любая идея, как исправить?

  • 0
    Как выглядит $ini_array ? Я почти уверен, что вы не можете использовать parse_ini_file() вот так; дублированные заголовки разделов будут перезаписаны. Вы должны использовать базу данных вместо этого.
  • 0
    Хм, похоже, ты прав. Любая идея, как получить файл, проанализированный, как я описал выше?
Показать ещё 6 комментариев
Теги:
arrays
parsing
ini

1 ответ

3

Из соображений, изложенных в комментариях, вы не можете использовать 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.

  • 0
    Как получить, например, поле «описание» пользователя «sdadsa»? Я попробовал это echo $ account ['sdadsa' ['description']];
  • 0
    @dehniz Как и в случае с любым другим многомерным массивом, т.е. $accounts['sdadsa']['description']
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню