Я использовал функцию 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"
Его комментарии тоже исчезают.
Задача ещё не решена.
Других решений пока нет …