2025-06-28 18:15:18 +03:00

163 lines
5.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}