20250203
This commit is contained in:
		
							
								
								
									
										60
									
								
								sources/extensions/ArrayExtension.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								sources/extensions/ArrayExtension.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| <?php | ||||
|  | ||||
| namespace goodboyalex\php_components_pack\extensions; | ||||
|  | ||||
| /** | ||||
|  * Расширение массивов. | ||||
|  * | ||||
|  * @author Александр Бабаев | ||||
|  * @package php_components_pack | ||||
|  * @version 1.0 | ||||
|  * @since 1.0 | ||||
|  */ | ||||
| final class ArrayExtension | ||||
| { | ||||
|     /** | ||||
|      * Удаляет пустые строки в массиве. | ||||
|      * | ||||
|      * @param array $array Исходный массив | ||||
|      * @param bool $reOrder Переиндексировать массив | ||||
|      * | ||||
|      * @return array Результирующим массив без пустых строк | ||||
|      */ | ||||
|     public static function RemoveEmpties (array $array, bool $reOrder = false): array | ||||
|     { | ||||
|         // Удаляем пустые строки | ||||
|         $result = array_filter($array, fn ($value) => !is_null($value) && $value !== ''); | ||||
|  | ||||
|         // Переиндексируем массив | ||||
|         if ($reOrder) | ||||
|             $result = array_values($result); | ||||
|  | ||||
|         // Возвращаем результат | ||||
|         return $result; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Выделяет в смешанном массиве ассоциативный массив | ||||
|      * | ||||
|      * @param array $array Исходный массив | ||||
|      * | ||||
|      * @return array Ассоциативный массив, содержащийся в исходном массиве | ||||
|      */ | ||||
|     public static function GetAssociativePart (array $array): array | ||||
|     { | ||||
|         // Фильтруем массив, оставляя только элементы со строковыми ключами | ||||
|         return array_filter($array, fn ($key) => self::IsStringKey($key), ARRAY_FILTER_USE_KEY); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Функция для проверки, является ли ключ строковым | ||||
|      * | ||||
|      * @param mixed $key Ключ | ||||
|      * | ||||
|      * @return bool Является ли ключ строковым типом | ||||
|      */ | ||||
|     public static function IsStringKey (mixed $key): bool | ||||
|     { | ||||
|         return !is_int($key); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										147
									
								
								sources/extensions/GUIDExtension.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								sources/extensions/GUIDExtension.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
| <?php | ||||
|  | ||||
| namespace goodboyalex\php_components_pack\extensions; | ||||
|  | ||||
| use Random\RandomException; | ||||
|  | ||||
| /** | ||||
|  * Расширение Guid. | ||||
|  * | ||||
|  * @author Александр Бабаев | ||||
|  * @package php_components_pack | ||||
|  * @version 1.0 | ||||
|  * @since 1.0 | ||||
|  */ | ||||
| final class GUIDExtension | ||||
| { | ||||
|     /** | ||||
|      * Пустой Guid. | ||||
|      */ | ||||
|     public const string GUIDEmpty = "00000000-0000-0000-0000-000000000000"; | ||||
|  | ||||
|     /** | ||||
|      * Генерирует Guid. | ||||
|      * | ||||
|      * @return string Сгенерированный Guid. | ||||
|      */ | ||||
|     public static function Generate (): string | ||||
|     { | ||||
|         // Цикл создания Guid | ||||
|         do | ||||
|             $guid = self::DoGenerate(); | ||||
|             // - пока Guid не будет корректен | ||||
|         while (!self::Validate($guid)); | ||||
|  | ||||
|         // Возвращаем Guid | ||||
|         return $guid; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Генерирует Guid. | ||||
|      * | ||||
|      * @return string Сгенерированный Guid. | ||||
|      */ | ||||
|     private static function DoGenerate (): string | ||||
|     { | ||||
|         try { | ||||
|             return sprintf( | ||||
|                 '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', | ||||
|                 // 32 bits for "time_low" | ||||
|                 random_int(0, 0xffff), | ||||
|                 random_int(0, 0xffff), | ||||
|  | ||||
|                 // 16 bits for "time_mid" | ||||
|                 random_int(0, 0xffff), | ||||
|  | ||||
|                 // 16 bits for "time_hi_and_version", | ||||
|                 // four most significant bits holds version number 4 | ||||
|                 random_int(0, 0x0fff) | 0x4000, | ||||
|  | ||||
|                 // 16 bits, 8 bits for "clk_seq_hi_res", | ||||
|                 // 8 bits for "clk_seq_low", | ||||
|                 // two most significant bits holds zero and one for variant DCE1.1 | ||||
|                 random_int(0, 0x3fff) | 0x8000, | ||||
|  | ||||
|                 // 48 bits for "node" | ||||
|                 random_int(0, 0xffff), | ||||
|                 random_int(0, 0xffff), | ||||
|                 random_int(0, 0xffff) | ||||
|             ); | ||||
|         } | ||||
|         catch (RandomException) { | ||||
|             return self::GUIDEmpty; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Проверяет Guid на корректность. | ||||
|      * | ||||
|      * @param string|null $str Guid на проверку | ||||
|      * | ||||
|      * @return bool Корректен ли Guid. | ||||
|      */ | ||||
|     public static function Validate (?string $str): bool | ||||
|     { | ||||
|         // Если Guid пустой | ||||
|         if (StringExtension::IsNullOrWhitespace($str)) | ||||
|             // - возвращаем false | ||||
|             return false; | ||||
|  | ||||
|         // Проверяем длину | ||||
|         $isLenCorrect = strlen($str) == 36; | ||||
|  | ||||
|         // Если длина не корректна | ||||
|         if (!$isLenCorrect) | ||||
|             // - возвращаем false | ||||
|             return false; | ||||
|  | ||||
|         // Разбиваем на части | ||||
|         $explodedStr = explode("-", $str); | ||||
|  | ||||
|         // Если количество частей не равно 5 | ||||
|         if (count($explodedStr) !== 5) | ||||
|             // - возвращаем false | ||||
|             return false; | ||||
|  | ||||
|         // Проверяем длину каждой части | ||||
|         // - первая часть должна быть длиной 8 символов | ||||
|         if (strlen($explodedStr[0]) !== 8) | ||||
|             // -- возвращаем false | ||||
|             return false; | ||||
|  | ||||
|         // - вторая часть должна быть длиной 4 символа | ||||
|         if (strlen($explodedStr[1]) !== 4) | ||||
|             // -- возвращаем false | ||||
|             return false; | ||||
|  | ||||
|         // - третья часть должна быть длиной 4 символа | ||||
|         if (strlen($explodedStr[2]) !== 4) | ||||
|             // -- возвращаем false | ||||
|             return false; | ||||
|  | ||||
|         // - четвертая часть должна быть длиной 4 символа | ||||
|         if (strlen($explodedStr[3]) !== 4) | ||||
|             // -- возвращаем false | ||||
|             return false; | ||||
|  | ||||
|         // - пятая часть должна быть длиной 12 символов | ||||
|         if (strlen($explodedStr[4]) !== 12) | ||||
|             // -- возвращаем false | ||||
|             return false; | ||||
|  | ||||
|         // Проверка пройдена | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Проверяет Guid на пустоту. | ||||
|      * | ||||
|      * @param string|null $str Guid на проверку | ||||
|      * | ||||
|      * @return bool Пустой ли GUID | ||||
|      */ | ||||
|     public static function IsNotValidOrEmpty (?string $str): bool | ||||
|     { | ||||
|         return !self::Validate($str) || $str == self::GUIDEmpty; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										210
									
								
								sources/extensions/StringExtension.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								sources/extensions/StringExtension.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,210 @@ | ||||
| <?php | ||||
|  | ||||
| namespace goodboyalex\php_components_pack\extensions; | ||||
|  | ||||
| /** | ||||
|  * Расширение строк. | ||||
|  * | ||||
|  * @author Александр Бабаев | ||||
|  * @package php_components_pack | ||||
|  * @version 1.0 | ||||
|  * @since 1.0 | ||||
|  */ | ||||
| final class StringExtension | ||||
| { | ||||
|     /** | ||||
|      * @var array|string[] $RussianLetters Набор русских букв | ||||
|      */ | ||||
|     private static array $RussianLetters = | ||||
|         [ | ||||
|             'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', | ||||
|             'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', | ||||
|             'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', | ||||
|             'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', | ||||
|             'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', | ||||
|             'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я' | ||||
|         ]; | ||||
|  | ||||
|     /** | ||||
|      * @var array|string[] $RussianLettersTransliteration Набор русских букв в транслитерации | ||||
|      */ | ||||
|     private static array $RussianLettersTransliteration = | ||||
|         [ | ||||
|             "a", "b", "v", "g", "d", "e", "yo", "zh", "z", "i", "j", | ||||
|             "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", | ||||
|             "h", "c", "ch", "sh", "sch", "j", "i", "j", "e", "yu", "ya", | ||||
|             "A", "B", "V", "G", "D", "E", "Yo", "Zh", "Z", "I", "J", | ||||
|             "K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "F", | ||||
|             "H", "C", "Ch", "Sh", "Sch", "J", "I", "J", "E", "Yu", "Ya" | ||||
|         ]; | ||||
|  | ||||
|     /** | ||||
|      * Сравнивает две строки. | ||||
|      * | ||||
|      * @param string|null $str1 Первая строка. | ||||
|      * @param string|null $str2 Вторая строка. | ||||
|      * @param bool $ignoreCase Игнорировать регистр. | ||||
|      * | ||||
|      * @return int Результат сравнения. Возвращаемые значения: | ||||
|      * | ||||
|      *      -1 | значение $str1 меньше значения $str2. | ||||
|      *       0 | значения $str1 и $str2 равны. | ||||
|      *       1 | значение $str1 больше значения $str2. | ||||
|      */ | ||||
|     public static function Compare (string|null $str1, string|null $str2, bool $ignoreCase = false): int | ||||
|     { | ||||
|         // Если оба пусты | ||||
|         if (self::IsNullOrWhitespace($str1) && self::IsNullOrWhitespace($str2)) | ||||
|             // - то равны | ||||
|             return 0; | ||||
|  | ||||
|         // Если первый из них не пуст, а второй пуст | ||||
|         if (!self::IsNullOrWhitespace($str1) && self::IsNullOrWhitespace($str2)) | ||||
|             // - то первый больше | ||||
|             return 1; | ||||
|  | ||||
|         // Если первый из них пуст, а второй не пуст | ||||
|         if (!self::IsNullOrWhitespace($str1) && self::IsNullOrWhitespace($str2)) | ||||
|             // - то первый меньше | ||||
|             return -1; | ||||
|  | ||||
|         // Если нужно игнорировать регистр | ||||
|         if ($ignoreCase) | ||||
|             // - то сравниваем по "человечески" без учёта регистра | ||||
|             return strnatcasecmp($str1, $str2); | ||||
|  | ||||
|         // Иначе сравниваем по "человечески" с учётом регистра | ||||
|         return strnatcmp($str1, $str2); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Проверяет, пуста ли строка, содержит ли вместо текста только пробелы. | ||||
|      * | ||||
|      * @param string|null $str Проверяемая строка. | ||||
|      * | ||||
|      * @return bool Результат проверки. | ||||
|      */ | ||||
|     public static function IsNullOrWhitespace (string|null $str): bool | ||||
|     { | ||||
|         return self::IsNullOrEmpty($str) || trim($str) === ''; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Проверяет, пуста ли строка. | ||||
|      * | ||||
|      * @param string|null $str Проверяемая строка. | ||||
|      * | ||||
|      * @return bool Результат проверки. | ||||
|      */ | ||||
|     public static function IsNullOrEmpty (string|null $str): bool | ||||
|     { | ||||
|         return is_null($str) || $str === ''; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Конвертация в латиницу. | ||||
|      * | ||||
|      * @param string $source Исходное слово или выражение | ||||
|      * | ||||
|      * @return string Транслитерированное слово или выражение | ||||
|      */ | ||||
|     public static function ConvertToLatin (string $source): string | ||||
|     { | ||||
|         // Создаю результат | ||||
|         $result = ""; | ||||
|  | ||||
|         // Длина исходного слова | ||||
|         $length = mb_strlen($source); | ||||
|  | ||||
|         // Для каждой буквы или символа из слова | ||||
|         for ($i = 0; $i < $length; $i++) { | ||||
|             // - получаю букву или символ | ||||
|             $letter = mb_substr($source, $i, 1); | ||||
|  | ||||
|             // - если это буква из русского алфавита | ||||
|             if (self::IsRussianLetter($letter)) { | ||||
|                 // -- транслитерирую эту букву | ||||
|                 $resultTransliteration = self::TransliterationFromRussian($letter); | ||||
|  | ||||
|                 // -- если транслитерация не удалась | ||||
|                 if ($resultTransliteration === false) | ||||
|                     // --- вывожу оригинальную букву | ||||
|                     $result = $result . $letter; | ||||
|                 else | ||||
|                     // --- вывожу транслитерированную букву | ||||
|                     $result = $result . $resultTransliteration; | ||||
|  | ||||
|                 // -- и иду к следующей букве или символу | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // - если до сих пор буква или символ не обработаны, то возвращаю их | ||||
|             $result = $result . $letter; | ||||
|         } | ||||
|  | ||||
|         // Вывожу результат | ||||
|         return $result; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Проверяет, является ли буква русской. | ||||
|      * | ||||
|      * @param string $letter Буква | ||||
|      * | ||||
|      * @return bool Является ли буква русской | ||||
|      */ | ||||
|     private static function IsRussianLetter (string $letter): bool | ||||
|     { | ||||
|         return in_array($letter, self::$RussianLetters); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Получаю транслитерированную букву русского алфавита. | ||||
|      * | ||||
|      * @param string $letter Буква | ||||
|      * | ||||
|      * @return false|string Транслитерированная буква или false, если массивы не совпадают или буква не содержится | ||||
|      * в массивах. | ||||
|      */ | ||||
|     private static function TransliterationFromRussian (string $letter): false|string | ||||
|     { | ||||
|         // Если размерность массивов разная | ||||
|         if (count(self::$RussianLetters) !== count(self::$RussianLettersTransliteration)) | ||||
|             // - то вывожу ошибку | ||||
|             return false; | ||||
|  | ||||
|         // Получаю индекс буквы | ||||
|         $ind = array_search($letter, self::$RussianLetters, true); | ||||
|  | ||||
|         // Если буква не найдена | ||||
|         if ($ind === false) | ||||
|             // - то вывожу ошибку | ||||
|             return false; | ||||
|  | ||||
|         // Получаю транслитерированную букву | ||||
|         return self::$RussianLettersTransliteration[$ind]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Обрезает строку до указанных в параметре $maxLength символов | ||||
|      * | ||||
|      * @param string $text Исходный текст | ||||
|      * @param int $maxLength Максимальная длина текста | ||||
|      * @param string $endDots Суффикс, которым завершается обрезанная строка | ||||
|      * | ||||
|      * @return string Обрезанный текст | ||||
|      */ | ||||
|     public static function GetShortText (string $text, int $maxLength, string $endDots = ''): string | ||||
|     { | ||||
|         // Если длина текста меньше максимальной | ||||
|         if (mb_strlen($text) <= $maxLength) | ||||
|             // - то возвращаю исходный текст | ||||
|             return $text; | ||||
|  | ||||
|         // Если длина текста больше максимальной, то получаю длину текста без суффикса | ||||
|         $lengthWithoutEndDots = $maxLength - mb_strlen($endDots); | ||||
|  | ||||
|         // Возвращаю обрезанный текст | ||||
|         return mb_substr($text, 0, $lengthWithoutEndDots) . $endDots; | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user