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