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