20250629 1.1 Stable

This commit is contained in:
2025-06-29 20:29:52 +03:00
parent 58b3b74d99
commit 52de613b0f
10 changed files with 1365 additions and 118 deletions

View File

@@ -0,0 +1,69 @@
<?php
namespace goodboyalex\php_components_pack\traits\JsonReWriter;
/**
* Часть кода класса JsonReWriter, отвечающая за методы удаления ключей JSON.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.1.0
*/
trait JsonReWriterDeleteTrait
{
/**
* Очистка данных JSON.
*
* @return void
*/
public function Clear (): void
{
// Очистка данных
unset($this->JsonData);
// Создание пустого массива
$this->JsonData = [];
}
/**
* Удаление ключа JSON.
*
* @param string $key Требуемый ключ JSON для удаления.
*
* @return bool Результат удаления ключа: <code>true</code> - удаление прошло успешно, <code>false</code> -
* произошла ошибка при удалении.
*/
public function DeleteKey (string $key): bool
{
// Очищаем ключ
$preparedKey = $this->PrepareKey($key);
// Проверка ключа
if (!$this->IsKeyExists($preparedKey))
// - ключ не существует
return false;
// Разбиваем ключ на части
$keys = $this->ParseKey($preparedKey);
// Получаем текущий массив данных
$current = &$this->JsonData;
// Если ключ не является корневым
if (count($keys) > 0)
// - переходим к вложенному массиву
for ($i = 0; $i < count($keys) - 1; $i++)
// -- и добавляем массив данных
$current = &$current[$keys[$i]];
// Получаем удаляемый ключ
$deleteKey = $keys[count($keys) - 1];
// Удаляем ключ
unset($current[$deleteKey]);
// Проверяем удаление
return $this->IsKeyExists($key);
}
}

View File

@@ -0,0 +1,129 @@
<?php
namespace goodboyalex\php_components_pack\traits\JsonReWriter;
use goodboyalex\php_components_pack\extensions\StringExtension;
/**
* Часть кода класса JsonReWriter, отвечающая за методы работы с ключами JSON.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.1.0
*/
trait JsonReWriterKeyTrait
{
/**
* Проверяем наличие ключа в 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
{
// Очищаем ключ
$key = $this->PrepareKey($key);
// Разбиваем ключ на части
return explode('/', $key);
}
/**
* Подготавливает ключ к использованию внутри методов.
*
* @param string $key Неочищенный ключ.
*
* @return string Очищенный ключ.
*/
private function PrepareKey (string $key): string
{
return trim($key, "/ ");
}
/**
* Получение списка ключей.
*
* @param string $parentKey Ключ родителя (или "" (установлено по умолчанию) для всех).
* @param bool $includeChildren Нужно ли включать дочерние ключи (по умолчанию, да).
*
* @return array Список ключей.
*/
public function GetKeys (string $parentKey = "", bool $includeChildren = true): array
{
// Очищаем ключ
$parentKey = $this->PrepareKey($parentKey);
// Разбиваем ключ на части
$keys = StringExtension::IsNullOrWhitespace($parentKey) ? [] : $this->ParseKey($parentKey);
// Получаем текущий массив данных
$current = $this->JsonData;
// Если ключ не является корневым
if (count($keys) > 0)
// - переходим к вложенному массиву
for ($i = 0; $i < count($keys); $i++)
// -- и добавляем массив данных
$current = $current[$keys[$i]];
// Получаем список ключей родителя
$parentKeysList = array_keys($current);
// Если не нужно включать дочерние ключи
if (!$includeChildren)
// - возвращаем список родительских ключей
return $parentKeysList;
// Создаем результирующий массив
$result = [];
// Для каждого ключа
foreach ($parentKeysList as $key) {
// - очищаем текущий ключ
$currentKey = $this->PrepareKey($parentKey . "/" . $key);
// - добавляем его в результирующий массив
$result[] = $currentKey;
// - если у текущего ключа есть дочерние ключи
if (is_array($current[$key]))
// -- добавляем их в результирующий массив
$result = array_merge($result, $this->GetKeys($currentKey));
}
// Возвращаем результирующий массив
return $result;
}
}

View File

@@ -0,0 +1,56 @@
<?php
namespace goodboyalex\php_components_pack\traits\JsonReWriter;
/**
* Часть кода класса JsonReWriter, отвечающая за методы загрузки и сохранения JSON.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.1.0
*/
trait JsonReWriterLoadSaveTrait
{
/**
* Сохраняем 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;
}
}

View File

@@ -39,6 +39,9 @@ trait JsonReWriterReadTrait
*/
public function Read (string $key, mixed $default = null): mixed
{
// Подготавливаем ключ
$key = $this->PrepareKey($key);
// Проверяем, существует ли ключ
if (!$this->IsKeyExists($key))
// - если нет, то возвращаем значение по умолчанию
@@ -53,7 +56,7 @@ trait JsonReWriterReadTrait
// Для каждого ключа до предпоследнего
for ($i = 0; $i < count($keys) - 1; $i++)
// - переходим ко вложенному массиву
$current = &$current[$keys[$i]];
$current = $current[$keys[$i]];
// Возвращаем значение последнего ключа и если его нет, то возвращаем значение по умолчанию
return $current[$keys[count($keys) - 1]] ?? $default;
@@ -95,7 +98,27 @@ trait JsonReWriterReadTrait
*/
public function ReadArray (string $key, array $default = []): array
{
return (array)$this->Read($key, $default);
// Получаем значение ключа JSON
$serializedDef = json_encode($default);
// Читаем значение ключа JSON
$value = $this->ReadString($key, $serializedDef);
// Десериализуем значение ключа JSON
return json_decode($value, true);
}
/**
* Читает значение ключа JSON как строку.
*
* @param string $key Ключ JSON.
* @param string $default Значение по умолчанию.
*
* @return string Значение ключа JSON или значение по умолчанию.
*/
public function ReadString (string $key, string $default = ""): string
{
return (string)$this->Read($key, $default);
}
/**
@@ -108,7 +131,14 @@ trait JsonReWriterReadTrait
*/
public function ReadObject (string $key, object $default): object
{
return (object)$this->Read($key, $default);
// Получаем значение ключа JSON
$serializedDef = json_encode($default);
// Читаем значение ключа JSON
$value = $this->ReadString($key, $serializedDef);
// Десериализуем значение ключа JSON
return json_decode($value);
}
/**
@@ -140,17 +170,4 @@ trait JsonReWriterReadTrait
// Возвращаем объект
return $instance;
}
/**
* Читает значение ключа JSON как строку.
*
* @param string $key Ключ JSON.
* @param string $default Значение по умолчанию.
*
* @return string Значение ключа JSON или значение по умолчанию.
*/
public function ReadString (string $key, string $default = ""): string
{
return (string)$this->Read($key, $default);
}
}

View File

@@ -41,6 +41,9 @@ trait JsonReWriterWriteTrait
*/
public function Write (string $key, mixed $value): void
{
// Подготавливаем ключ
$key = $this->PrepareKey($key);
// Получаем массив ключей по вложенности
$keys = $this->ParseKey($key);
@@ -85,4 +88,22 @@ trait JsonReWriterWriteTrait
// Записываем в ключ
$this->Write($key, $serialized);
}
/**
* Записывает массив в ключ JSON.
*
* @param string $key Ключ JSON.
* @param array $array Массив для записи.
*
* @return void
* @throws JsonException Ключ не содержит вложений, хотя от него требуется обратное.
*/
public function WriteArray (string $key, array $array): void
{
// Сериализуем массив
$serialized = json_encode($array);
// Записываем в ключ
$this->Write($key, $serialized);
}
}