Вы не можете использовать str_replace()
здесь, потому что, как вы упомянули, он может заменять символы более одного раза, когда вы перебираете свой массив.Вместо этого вам следует перебирать символы вашей строки и подставлять каждый символ отдельно, по индексу.
for ($i = 0; $i < strlen($text); $i++) {
$text[$i] = $letters3[array_search($text[$i], $letters2)];
}
Хотя вы можете использовать два массива для символов алфавита и подстановки, я думаю, что ассоциативный массив является более подходящимструктура для этой задачи.
$text = 'abcdzwxy';
$letters2 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
$letters3 = ['z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'];
$map = array_combine($letters2, $letters3);
for ($i = 0; $i < strlen($text); $i++) {
$text[$i] = array_search($text[$i], $map);
}
echo $text;
Если строка содержит иврит или другие символы UTF-8, вы не можете перебрать ее, поскольку символ может содержать более одного байта.В этом случае вы можете использовать preg_split()
для создания массива символов UTF-8.
$text = preg_split('//u', $text, null, PREG_SPLIT_NO_EMPTY);
(код взят из этого ответа )
Остальной код в основном такой же, но теперь $text
- это массив, и он должен бытьпреобразован обратно в строку.
function str_to_array($str) {
return preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY);
}
$text = "תשר";
$text = str_to_array($text);
$alphabet = str_to_array("אבגדהוזחטיךכלםמןנסעףפץצקרשת");
$map = array_combine($alphabet, array_reverse($alphabet));
for ($i = 0; $i < sizeof($text); $i++) {
$char = array_search($text[$i], $map);
if ($char) {
$text[$i] = $char;
}
}
$text = implode($text);