171 lines
5.3 KiB
PHP
171 lines
5.3 KiB
PHP
<?php
|
||
|
||
namespace goodboyalex\php_components_pack\classes;
|
||
|
||
use goodboyalex\php_components_pack\enums\JsonErrorCode;
|
||
use goodboyalex\php_components_pack\exceptions\JsonException;
|
||
use goodboyalex\php_components_pack\traits\JsonReWriter\JsonReWriterReadTrait;
|
||
use goodboyalex\php_components_pack\traits\JsonReWriter\JsonReWriterWriteTrait;
|
||
|
||
/**
|
||
* Класс для работы с JSON-файлами.
|
||
*
|
||
* @author Александр Бабаев
|
||
* @package php_components_pack
|
||
* @version 1.0
|
||
* @since 1.1.0
|
||
*/
|
||
final class JsonReWriter
|
||
{
|
||
/**
|
||
* @var string $JsonString Строка JSON.
|
||
*/
|
||
public string $JsonString {
|
||
get {
|
||
// Преобразую данные в JSON
|
||
$json = json_encode($this->JsonData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
||
|
||
// Проверка на ошибки
|
||
if (json_last_error() !== JSON_ERROR_NONE)
|
||
// - если есть ошибки, выбрасываем исключение
|
||
throw new JsonException(null, JsonErrorCode::FromLastError(), json_last_error_msg());
|
||
|
||
// Возвращаем JSON
|
||
return $json;
|
||
}
|
||
set {
|
||
// Чтение содержимого файла и преобразование JSON в объект
|
||
$this->JsonData = json_decode($value, true);
|
||
|
||
// Проверка на ошибки
|
||
if ($this->JsonData === null && json_last_error() !== JSON_ERROR_NONE)
|
||
// - если есть ошибки, выбрасываем исключение
|
||
throw new JsonException($value, JsonErrorCode::FromLastError(), json_last_error_msg());
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @var array $JsonData Массив данных.
|
||
*/
|
||
private array $JsonData;
|
||
|
||
/**
|
||
* Конструктор класса.
|
||
*/
|
||
public function __construct ()
|
||
{
|
||
$this->JsonData = [];
|
||
}
|
||
|
||
/**
|
||
* Деструктор класса.
|
||
*/
|
||
public function __destruct ()
|
||
{
|
||
unset($this->JsonData);
|
||
}
|
||
|
||
/**
|
||
* Сохраняем JSON в файл.
|
||
*
|
||
* @param string $fileName Имя файла.
|
||
*
|
||
* @return bool Сохранены ли данные в файл: <code>true</code> - да, <code>false</code> - нет.
|
||
*/
|
||
public function SaveToFile (string $fileName): bool
|
||
{
|
||
// Запись данных в файл
|
||
return file_put_contents($fileName, $this->JsonString) !== false;
|
||
}
|
||
|
||
/**
|
||
* Загрузка данных из JSON-файла.
|
||
*
|
||
* @param string $fileName Имя файла.
|
||
*
|
||
* @return bool Загрузились ли данные из файла: <code>true</code> - да, <code>false</code> - нет.
|
||
*/
|
||
public function LoadFromFile (string $fileName): bool
|
||
{
|
||
// Проверка существования файла
|
||
if (!is_file($fileName))
|
||
// - если нет, возвращаем false
|
||
return false;
|
||
|
||
// Чтение содержимого файла
|
||
$result = file_get_contents($fileName);
|
||
|
||
// Проверка на ошибки
|
||
if ($result === false)
|
||
// - если есть ошибки, возвращаем false
|
||
return false;
|
||
|
||
// Записываем результат
|
||
$this->JsonString = $result;
|
||
|
||
// Возвращаем true, если все хорошо
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Проверяем наличие ключа в 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
|
||
{
|
||
|
||
}
|
||
|
||
// Подключаем методы чтения JSON
|
||
use JsonReWriterReadTrait;
|
||
|
||
// Подключаем методы записи JSON
|
||
use JsonReWriterWriteTrait;
|
||
} |