Skip to content

Instantly share code, notes, and snippets.

@DKepov
Last active October 3, 2015 09:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DKepov/4f4000210af4e09d8cf6 to your computer and use it in GitHub Desktop.
Save DKepov/4f4000210af4e09d8cf6 to your computer and use it in GitHub Desktop.
Parse custom ini-file
<?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>';
@DKepov
Copy link
Author

DKepov commented Sep 29, 2015

// файлы
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>';

@DKepov
Copy link
Author

DKepov commented Sep 29, 2015

input

# Это комментарий

db.user = vasya
db.34 = fdfsd
db.password = asd123
db.driver.type = mysql
db.driver2.type =     mysql2

db.logic.type.driver1 = asdasdasd1
db.logic.type.driver2 = asdasdasd2
db.logic.type.driver3 = asdasdasd3

# И это комментарий

@DKepov
Copy link
Author

DKepov commented Sep 29, 2015

output

Array
(
    [db] => Array
        (
            [user] => vasya
            [34] => fdfsd
            [password] => asd123
            [driver] => Array
                (
                    [type] => mysql
                )

            [driver2] => Array
                (
                    [type] => mysql2
                )

            [logic] => Array
                (
                    [type] => Array
                        (
                            [driver1] => asdasdasd1
                            [driver2] => asdasdasd2
                            [driver3] => asdasdasd3
                        )

                )

        )

)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment