Массив с хитрым дублированием

Я использовал функцию PHP parse_ini_file () построить структуру массива из файла INI, который у меня есть, но я был несколько вынужден создать собственный анализатор, потому что нативная функция не поддерживает вложенные файлы и не анализирует комментарии к файлам.

Хотя настоящие INI-файлы не поддерживают сложную иерархию, с такой функцией я мог бы легко манипулировать другой информацией, которая у меня есть (или я так надеюсь).

И возможность иметь комментарии в файле на самом деле не является обязательным требованием, но если я разрешу редактировать INI-файл через графический интерфейс, если у меня нет доступа к ним, полученный файл не будет иметь особого смысла.

И это «необязательное требование» — проблема, которую я не могу решить.

Хорошо … Я публикую класс (и поддерживающий интерфейс) в этот гист потому что это немного большой.

Не судите о методе Считыватель :: процесс () слишком сложно, потому что это не настоящий класс. Реальный включает в себя целый потоковый ридер, который просто усложнит ситуацию, если он будет опубликован здесь. Этот фрагмент, однако, является действительной заменой.

INI-файл, который я использую для тестирования:

[info]
; Comment Section 1: author
author="Bruno Augusto"; Comment Section 1: copyright
copyright="MIT"
[descriptor]
; Comment Section 2: name
name="Item Name"; Comment Section 2: description
description="Item Description"; Comment Section 2: Line 1
; Comment Section 2, Line 2 (version)
version=1.0

[contents]
; Comment Section 3: Line 1
; Comment Section 3, Line 2 (files)
files[] = config.ini
files[] = folder/file1.php
files[] = folder/folder2/file2.php
files[] = folder/folder2/folder3/file3.php
files[] = folder/folder2/folder3/file4.php

[hierarchyTest]
; Comment Section 4: levels
levels[first\second\third] = "foo"levels[first\second\third] = "anotherone"levels[first\second\third] = "onemore"levels[first\second\third\fourth] = "bar"levels[first\second\third\fourth] = "baaz"
[hierarchyTest2]
; Comment Section 5: Line 1
; Comment Section 5, Line 2 (levels2)
levels2[first.second.third] = "baaz"

Использование так же просто, как создание экземпляра класса Reader с путем к файлу INI и вызов Читатель :: прочитать () метод. Мы все большие мальчики здесь, я думаю, что могу это подавить. :п

Глючные комментарии обрабатываются начиная с строки 68 и добавил к окончательной структуре в строке 81*.

Проблема в том, что в настоящее время все значения накапливаются после каждой итерации. В этом виноват array_merge (), используемый в строке 69. Удаляя это:

$comments = $line;

Почти все работает нормально, за исключением того, что многострочные комментарии содержат только последнюю строку, как и ожидалось прямым присваиванием.

Первоначально я думал, что смогу просто очистить массив после его использования, поэтому я добавил такую ​​инструкцию в строку 84:

$comments = array();

А вот и странность. Это работает хорошо почти для всех записей, но разделы с именем содержание а также hierarchyTest нет комментариев добавлено.

Я выделил проблему, и это из-за анализа иерархии, начиная с строки 92 но я понятия не имею, как это решить.

Эта изоляция настолько верна, что если я добавлю еще одну запись в последний раздел (ierarchyTest2) в формате:

levels2[first.second.third] = "baazaaa"

Его комментарии тоже исчезают.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]