20250629 1.1 Stable
This commit is contained in:
69
sources/traits/JsonReWriter/JsonReWriterDeleteTrait.php
Normal file
69
sources/traits/JsonReWriter/JsonReWriterDeleteTrait.php
Normal 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);
|
||||
}
|
||||
}
|
129
sources/traits/JsonReWriter/JsonReWriterKeyTrait.php
Normal file
129
sources/traits/JsonReWriter/JsonReWriterKeyTrait.php
Normal 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;
|
||||
}
|
||||
}
|
56
sources/traits/JsonReWriter/JsonReWriterLoadSaveTrait.php
Normal file
56
sources/traits/JsonReWriter/JsonReWriterLoadSaveTrait.php
Normal 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;
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user