PHP: динамический многомерный массив с числом элементов N - PullRequest
0 голосов
/ 03 июня 2011

Я пытаюсь создать массив, содержащий файл конфигурации, но у меня возникают проблемы, когда некоторые ключи имеют одинаковые имена. Допустим, у меня есть конфиг в таком формате:

dinner=salad
dish.fruit.first.name=apple
dish.fruit.first.juicy=true
dish.fruit.second.name=lettuce
dish.fruit.second.juicy=false
dressing.name=french
dressing.tasty=true

и это будет преобразовано в массив, подобный этому, с мыслью, что может быть любое количество значений разделенных запятыми ключей:

Array
(
  [dinner] => "salad"
  [dish] => Array
  (
    [fruit] => Array
    (
      [first] => Array
      (
        [name] => "apple"
        [juicy] => "true"
      )
      [second] => Array
      (
        [name] => "lettuce"
        [juicy] => "false"
      )
    )
  )
  [dressing] => Array
  (
    [name] => "french"
    [tasty] => "true"
  )
)

Но я не могу обдумать это. Я попытался создать цикл foreach и вставить новый массив в последний массив по ссылкам, но он берет только первый набор ключей, начинающийся с того же имени. Вот мой текущий код и результат:

    $config = array();
    $filehandle = @fopen($filename, "r");
    while (!feof($filehandle))
    {
        $line           = ereg_replace("/\n\r|\r\n|\n|\r/", "", fgets($filehandle, 4096));
        $configArray    = explode("=", $line);
        $configKeys     = explode(".", $configArray[0]);
        $configValue    = $configArray[1];

        foreach ($configKeys as $key)
        {
            if (isset($head))
            {
                $last[$key] = array();
                $last = &$last[$key];
            }
            else
            {
                $head[$key] = array();
                $last = &$head[$key];
            }
        }
        $last = $configValue;
        $config += $head;
        unset($head);
        unset($last);
    }
    fclose($filehandle);

результат:

Array
(
  [dinnes] => "salad"
  [dish] => Array
  (
    [fruit] => Array
    (
      [first] => Array
      (
        [name] => "apple"
      )
    )
  )
  [dressing] => Array
  (
    [name] => "french"
  )
)

1 Ответ

2 голосов
/ 03 июня 2011

В нем были различные проблемы.

В назначении $config += $head; записи будут перезаписаны.Предпочитаю array_merge для таких случаев.А также $head не было определено;Понятия не имею, откуда это.

Другое упрощение - просто обход структуры массива с использованием = &$last[$key].Это неявно определяет подмассив.Но вы, конечно, можете сохранить isset или использовать settype для ясности.

$config = array();
$filehandle = @fopen(2, "r");
while (!feof($filehandle))
{
    $line           = ereg_replace("/\n\r|\r\n|\n|\r/", "", fgets($filehandle, 4096));
    $configArray    = explode("=", $line);
    $configKeys     = explode(".", $configArray[0]);
    $configValue    = $configArray[1];

    $last = &$config;
    foreach ($configKeys as $key)
    {
            $last = &$last[$key];
    }
    $last = $configValue;

}
fclose($filehandle);

Кстати, ereg функции несколько устарели.И вы могли бы упростить это намного больше, используя один preg_match_all или, что еще лучше, читая файл ini-style, используя parse_ini_file.- (См. Аналогичный ответ здесь php parse_ini_file oop & deep , хотя и использует структуру объекта.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...