129 lines
4.6 KiB
PHP
129 lines
4.6 KiB
PHP
<?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;
|
||
}
|
||
} |