163 lines
5.5 KiB
PHP
163 lines
5.5 KiB
PHP
<?php
|
||
|
||
namespace goodboyalex\php_components_pack\classes;
|
||
|
||
use goodboyalex\php_components_pack\exceptions\JsonException;
|
||
use goodboyalex\php_components_pack\traits\JsonReWriter\JsonReWriterReadTrait;
|
||
|
||
/**
|
||
* Класс для работы с JSON-файлами.
|
||
*
|
||
* @author Александр Бабаев
|
||
* @package php_components_pack
|
||
* @version 1.0
|
||
* @since 1.1.0
|
||
*/
|
||
final class JsonReWriter
|
||
{
|
||
/**
|
||
* @var array $JsonData Массив данных.
|
||
*/
|
||
public array $JsonData;
|
||
|
||
/**
|
||
* Конструктор класса.
|
||
*/
|
||
public function __construct ()
|
||
{
|
||
$this->JsonData = [];
|
||
}
|
||
|
||
/**
|
||
* Деструктор класса.
|
||
*/
|
||
public function __destruct ()
|
||
{
|
||
unset($this->JsonData);
|
||
}
|
||
|
||
/**
|
||
* Сохраняем JSON в файл.
|
||
*
|
||
* @param string $fileName Имя файла.
|
||
*
|
||
* @return void
|
||
* @throws JsonException Если файл не может быть сохранен.
|
||
*/
|
||
public function SaveToFile (string $fileName): void
|
||
{
|
||
// Запись данных в файл
|
||
file_put_contents($fileName, json_encode($this->JsonData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
|
||
|
||
// Проверка на ошибки
|
||
if (json_last_error() !== JSON_ERROR_NONE)
|
||
// - если есть ошибки, выбрасываем исключение
|
||
throw new JsonException($fileName, json_last_error(), json_last_error_msg());
|
||
}
|
||
|
||
/**
|
||
* Загрузка данных из JSON-файла.
|
||
*
|
||
* @param string $fileName Имя файла.
|
||
*
|
||
* @return void
|
||
* @throws JsonException Если файл не существует или содержит ошибки.
|
||
*/
|
||
public function LoadFromFile (string $fileName): void
|
||
{
|
||
// Проверка существования файла
|
||
if (!is_file($fileName))
|
||
// - нет? Выбрасываем исключение
|
||
throw new JsonException($fileName, -1, "File does not exist / Файл не существует");
|
||
|
||
// Чтение содержимого файла и преобразование JSON в объект
|
||
$this->JsonData = json_decode(file_get_contents($fileName), true);
|
||
|
||
// Проверка на ошибки
|
||
if ($this->JsonData === null && json_last_error() !== JSON_ERROR_NONE)
|
||
// - если есть ошибки, выбрасываем исключение
|
||
throw new JsonException($fileName, json_last_error(), json_last_error_msg());
|
||
}
|
||
|
||
/**
|
||
* Проверяем наличие ключа в JSON.
|
||
*
|
||
* @param string $key Ключ.
|
||
*
|
||
* @return bool true если ключ найден, false если нет.
|
||
*/
|
||
public function IsKeyExists (string $key): bool
|
||
{
|
||
// Получаем массив ключей по вложенности
|
||
$keys = $this->ParseKey($key);
|
||
|
||
// Получаем текущий массив данных
|
||
$current = $this->JsonData;
|
||
|
||
// Для каждого ключа
|
||
foreach ($keys as $key) {
|
||
// - проверяем наличие ключа в текущем массиве
|
||
if (!array_key_exists($key, $current))
|
||
// - нет? Возвращаем false
|
||
return false;
|
||
|
||
// Переходим ко вложенному массиву
|
||
$current = $current[$key];
|
||
}
|
||
|
||
// Возвращаем true, если все ключи найдены
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Получение ключей по вложенности. Т.е., ключи вида <code>"key1/key2/key3" => ["key1", "key2", "key3"]</code>.
|
||
*
|
||
* @param string $key Ключ.
|
||
*
|
||
* @return array Ключи по вложенности.
|
||
*/
|
||
private function ParseKey (string $key): array
|
||
{
|
||
return explode('/', $key);
|
||
}
|
||
|
||
/**
|
||
* Создание ключа в JSON.
|
||
*
|
||
* @param string $key Ключ.
|
||
* @param mixed $value Значение.
|
||
*
|
||
* @return void
|
||
* @throws JsonException Если ключ не является массивом.
|
||
*/
|
||
private function CreateKey (string $key, mixed $value): void
|
||
{
|
||
// Получаем массив ключей по вложенности
|
||
$keys = $this->ParseKey($key);
|
||
|
||
// Получаем текущий массив данных
|
||
$current = &$this->JsonData;
|
||
|
||
// Для каждого ключа до предпоследнего
|
||
for ($i = 0; $i < count($keys) - 1; $i++) {
|
||
// - проверяем наличие ключа в текущем массиве
|
||
if (!isset($current[$keys[$i]]))
|
||
// - нет? Создаем ключ (массив)
|
||
$current[$keys[$i]] = [];
|
||
|
||
// - проверяем, что ключ является массивом
|
||
if (!is_array($current[$keys[$i]]))
|
||
// - нет? Выбрасываем исключение
|
||
throw new JsonException(null, -1, "Key is not an array / Ключ не является массивом!");
|
||
|
||
// - переходим ко вложенному массиву
|
||
$current = &$current[$keys[$i]];
|
||
}
|
||
|
||
// Создаем ключ (значение)
|
||
$current[$keys[count($keys) - 1]] = $value;
|
||
}
|
||
|
||
// Подключаем методы чтения JSON
|
||
use JsonReWriterReadTrait;
|
||
} |