Проблема в реализации функции: зеркальные буквы
Всем доброго дня, пытаюсь реализовать интересную функцию которая будет менять местами буквы к примеру A будет Z, Z будет A, B будет Y и тд и тп. И с помощью этой функции можно будет создавать слова которые будут выводиться в соответствующем порядке то есть к примеру AFF GZIT = ZOO PARK. Пытаюсь понять как правильно это сделать, нужно ли каждую букву занести в ассоциативный массив и с помощью array_reverse их выводить в обратном порядке, и само создание слова будет идти через цикл for or foreach?
Код:
function mirrorLetter($certainLetter)
{
$certainArray1 = [ 'A' => 'Z', 'B' => 'Y', 'C' => 'X', 'D' => 'W',
'E' => 'V', 'F' => 'O', 'G' => 'P', 'H' => 'Q',
'I' => 'R', 'J' => 'S', 'K' => 'T', 'L' => 'U',
'M' => 'N'];
$certainArray2 = [ 'Z' => 'A', 'Y' => 'B', 'X' => 'C', 'W' => 'D',
'V' => 'E', 'O' => 'F', 'P' => 'G', 'Q' => 'H',
'R' => 'I', 'S' => 'J', 'T' => 'K', 'U' => 'L',
'N' => 'M'];
$certainArray1 = array_reverse($certainArray1);
$certainArray2 = array_reverse($certainArray2);
return $certainArray1[$certainLetter];
}
echo mirrorLetter('A');
Ответы (5 шт):
$lit = [
'A' => 'Z',
'B' => 'Y',
'C' => 'X',
'D' => 'W',
'E' => 'V',
'F' => 'O',
'G' => 'P',
'H' => 'Q',
'I' => 'R',
'J' => 'S',
'K' => 'T',
'L' => 'U',
'M' => 'N'
];
function code($world, $lit)
{
$ret = '';
$str = str_split($world);
foreach($str as $val)
$ret .= $lit[$val];
return $ret;
}
function decode($world, $lit)
{
$ret = '';
$str = str_split($world);
foreach($str as $val)
$ret .= array_search($val, $lit);
return $ret;
}
$code = code('ADAM', $lit);
echo $code . '<br>';
echo decode($code, $lit);
NOTICE: тут отсутсвуют некоторые проверки, например слово и букву надо привести к единому регистру, прежде чем сравнивать.
Суть:
- Делаем просто массив алфавита.
- Разбиваем исходную строку на символы
- Пробегаемся по массиву символов и находим его индекс
- Если он в середине алфавита, то берем из алфавита его индекс
- В ином случае берём индекс зеркального элемнета
function getMirrorredString($string) {
$alphabet = [ 'A', 'B', 'C', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'X', 'Y', 'Z'];
$mirroredString = '';
$splittedString = str_split($string);
$alphabetCount = count($alphabet);
$alphabetMiddle = floor($alphabetCount - 1 / 2);
foreach($splittedString as $char) {
$charIndex = array_search($char, $alphabet, true);
$mirroredString .= $charIndex === $alphabetMiddle ? $alphabet[$charIndex] : $alphabet[$alphabetCount - $charIndex - 1];
}
return $mirroredString;
}
echo getMirrorredString('ABCZYX');
function mirrorLetter($letter)
{
$code_letter = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'Z', 'Y', 'X', 'W', 'V', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'N', ' '];
$decode_letter = [ 'Z', 'Y', 'X', 'W', 'V', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'N', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', ' '];
for ($i=0; $i<count($code_letter); $i++){
if ($letter == $code_letter[$i]){
return $decode_letter[$i];
}
}
}
function mirrorWord($word)
{
foreach (str_split($word) as $letter){
$mirrorWord .= mirrorLetter($letter);
}
return $mirrorWord;
}
echo mirrorWord('AFF GZIT');
пусть уж для коллекции будет
function mirror($str){
$alphabet = str_split("abcdefghijklmnopqrstuvwxyz");
$xchange = array_combine($alphabet, array_reverse($alphabet));
return join(array_map(function($l) use ($xchange){
return $xchange[$l];
}, str_split($str) ));
};
и еще вариант через замену
function mirror($str){
$alphabet = str_split("abcdefghijklmnopqrstuvwxyz");
$xchange = str_split("ZYXWVUTSRQPONMLKJIHGFEDCBA");
return strtolower(str_replace($alphabet, $xchange, $str));
};
оба, очевидно, работают для строки в нижнем регистре
Для этого в PHP есть готовая функция strtr!
Пример: ideone
<?php
$replaceTable = [
'A' => 'Z',
'B' => 'Y',
'C' => 'X',
'D' => 'W',
'E' => 'V',
'F' => 'O',
'G' => 'P',
'H' => 'Q',
'I' => 'R',
'J' => 'S',
'K' => 'T',
'L' => 'U',
'M' => 'N',
'N' => 'M',
'O' => 'L',
'P' => 'K',
'Q' => 'J',
'R' => 'I',
'S' => 'H',
'T' => 'G',
'U' => 'F',
'V' => 'E',
'W' => 'D',
'X' => 'C',
'Y' => 'B',
'Z' => 'A'
];
$string = "HelloWorld";
echo strtr(strtoupper($string), $replaceTable);