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