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