Files
base_UA_EN/baseuaen.php
2025-01-07 15:54:23 +02:00

56 lines
1.7 KiB
PHP

<?php
class BaseUAEN
{
private const CHARACTERS = 'ABCEHKMOPTXY'; // Characters valid in both English and Ukrainian
private const MIN_LENGTH = 4;
private const MAX_LENGTH = 8;
public function intToCode(int $number, int $length): string
{
if ($length < self::MIN_LENGTH || $length > self::MAX_LENGTH) {
throw new InvalidArgumentException("Length must be between " . self::MIN_LENGTH . " and " . self::MAX_LENGTH);
}
$base = strlen(self::CHARACTERS);
$code = '';
do {
$remainder = $number % $base;
$code = self::CHARACTERS[$remainder] . $code;
$number = intdiv($number, $base);
} while ($number > 0);
return str_pad($code, $length, self::CHARACTERS[0], STR_PAD_LEFT);
}
public function codeToInt(string $code): int
{
$base = strlen(self::CHARACTERS);
$length = strlen($code);
$number = 0;
for ($i = 0; $i < $length; $i++) {
$char = $code[$i];
$charIndex = strpos(self::CHARACTERS, $char);
if ($charIndex === false) {
throw new InvalidArgumentException("Invalid character in code");
}
$number = $number * $base + $charIndex;
}
return $number;
}
public function generateRandomInt(int $length): int
{
if ($length < self::MIN_LENGTH || $length > self::MAX_LENGTH) {
throw new InvalidArgumentException("Length must be between " . self::MIN_LENGTH . " and " . self::MAX_LENGTH);
}
$base = strlen(self::CHARACTERS);
$maxNumber = bcpow($base, $length) - 1;
return random_int(0, $maxNumber);
}
}