php_components_pack/sources/traits/JsonReWriter/JsonReWriterKeyTrait.php
2025-06-29 20:29:52 +03:00

129 lines
4.6 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\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;
}
}