<?php
// файлы
define('INPUT', 'input.ini'); // входной
define('OUTPUT', 'output.ini'); // выходной
/**
* Class Parser
*
* Класс инкапсулирующий работу по парсингу кастомного ini-файла
*
* Пример файла:
* db.user = vasya
* db.password = asd123
* db.driver.type = mysql
* db.logic.type.driver = asdasdasd
*/
class Parser_ini
{
/**
* Установка входного и выходного потока для функции
*
* @param $input
* @param string $delimiter
*
* @return array
*/
public static function get_array($input, $delimiter = '.', $comment = '#')
{
// будущий выходной массив
$arr = [];
// цикл парсинга
foreach(explode(PHP_EOL, $input) as $item)
{
// отслеживаем пустые строки и комментарии
if ( ! $item OR $item{0} == $comment)
{
continue;
}
// разделяем строку на составной ключ, и значение
list($path, $value) = explode('=', $item);
// чистим строки от лишних пробелов
$path = trim($path);
$value = trim($value);
// записываем значение в массив
self::set_path($arr, $path, $value, $delimiter);
}
// возвращаем данные
return $arr;
}
/**
* Запись значения в переданный массив
*
* @param $array
* @param $path
* @param $value
* @param $delimiter
*/
private static function set_path( & $array, $path, $value, $delimiter)
{
// получаем путь в ключи
$keys = explode($delimiter, $path);
// проходимся по всем ключам в пути
// по-сути рекурсивный обход массива для вставки ключа
while (count($keys) > 1)
{
// вынимаем первый ключ-элемент пути
$key = array_shift($keys);
// если в целевом массиве нет нужного нам ключа, то создаем
if ( ! isset($array[$key]))
{
$array[$key] = array();
}
// делаем текущим массивом ключ массива
$array = & $array[$key];
}
// последний элемент ключа и есть ключ для значения
$array[array_shift($keys)] = $value;
}
}
// вызов
file_put_contents(
OUTPUT,
print_r(
Parser_ini::get_array(file_get_contents(INPUT)),
TRUE
)
);
// вывод на экран
echo '<pre>';
echo print_r(Parser_ini::get_array(file_get_contents(INPUT)), TRUE);
echo '</pre>';
Last active
October 3, 2015 09:06
-
-
Save DKepov/4f4000210af4e09d8cf6 to your computer and use it in GitHub Desktop.
Parse custom ini-file
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
output