Str_rot13
- это функция кодирования-декодирования, которая означает str_rot13(str_rot13('some string here'))==='some string here'
. Наиболее эффективный способ построения такой функции, по моему мнению, заключается в использовании простой внутренней карты. В PHP мы можем использовать массив, индексированный от 1 до 36, чтобы достичьэто вместо использования кода ASCII.С кодом ASCII Вы столкнетесь с трудностями в создании функции декодирования и кодирования, и, следовательно, ваш алгоритм будет менее быстрым. Ниже приведена базовая реализация функции кодирования-декодирования str_rot18, как пояснено выше:
function str_rot18($string){
if(!is_string($string)) return false;
$map=array (
'a' => 1, 'b' => 2,'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6,'g' => 7,'h' => 8,
'i' => 9,
'j' => 10,'k' => 11,'l' => 12,'m' => 13,'n' => 14,'o' => 15,'p' => 16,'q' => 17,
'r' => 18,
's' => 19,'t' => 20, 'u' => 21,'v' => 22,'w' => 23,'x' => 24,'y' => 25,'z' => 26,
0 => 27,1 => 28,2 => 29,3 => 30,4 => 31,5 => 32,6 => 33,7 => 34,8 => 35,9 => 36,
);
$flipped_map=array (
1 => 'a',2 => 'b',3 => 'c',4 => 'd',5 => 'e',6 => 'f',7 => 'g',8 => 'h',9 => 'i',
10 => 'j',11 => 'k',12 => 'l',13 => 'm',14 => 'n',15 => 'o',16 => 'p',17 => 'q',
18 => 'r',19 => 's',20 => 't',21 => 'u',22 => 'v',23 => 'w',24 => 'x',25 => 'y',
26 => 'z',27 => 0,28 => 1,29 => 2,30 => 3,31 => 4,32 => 5,33 => 6,34 => 7,35 => 8,
36 => 9,
);
for ($i = 0, $j = strlen( $string); $i < $j; $i++)
{
if(!ctype_digit($string[$i])){
$char=mb_strtolower($string[$i]);
}
else $char=(int)$string[$i];
if(isset($map[$char])){
$tmp = $map[$char]+18;
$tmp=($tmp>36)?$tmp-36:$tmp;
if(!ctype_lower($string[$i])&&!ctype_digit($string[$i]))
$string[$i]=mb_strtoupper($flipped_map[$tmp]);
else
$string[$i]=$flipped_map[$tmp];
}
}
return $string;
}
Конечно, это можно улучшить, но это уже хорошая отправная точка ...
Однако , если вы действительно хотите использовать код ASCII, я предлагаю использовать полный ASCIIкарта, позволяющая использовать все символы и поддерживающая дух быстрой и простой в реализации функции кодирования-декодирования. Таким образом, ваша функция будет str_rot128
вместо str_rot18
:
function str_rot128($string){
if(!is_string($string)) return false;
for ($i = 0, $j = strlen( $string); $i < $j; $i++)
{
// Get the ASCII character for the current character
$char=ord($string[$i])+128;
$char=$char>256?$char-256:$char;
$string[$i]=chr($char);
}
return $string;
}
Вы можете увидеть рабочийкод здесь: Альтернатива str_rot13 с использованием большего количества символов, чем az