строка — самый эффективный способ получить предыдущую букву в алфавите, используя переполнение стека

Работает красиво:

$str = 'a';
echo ++$str; // prints 'b'

$str = 'z';
echo ++$str; // prints 'aa'

Очень полезно получить имя следующего столбца в файле Excel.

Но если я использую подобный код, используя оператор -, чтобы получить предыдущую букву, то она не работает:

$str = 'b';
echo --$str; // prints 'b' but I need 'a'

$str = 'aa';
echo --$str; // prints 'aa' but I need 'z'

Какое может быть решение, чтобы получить предыдущее письмо аналогично?
И в чем может быть причина, так как он не работает?

9

Решение

$str='z';
echo chr(ord($str)-1);   //y

Примечание: это не круговая a-z, Нужно добавить правила для этого

скрипка

редактировать
Это редактирование охватывает ваши специальные требования из примера Excel. Хотя это немного более длинный кусок кода.

//Step 1: Build your range; We cant just go about every character in every language.

$x='a';
while($x!='zz')         // of course you can take that to zzz or beyond etc
{
$values[]=$x++;       // A simple range() call will not work for multiple characters
}
$values[]=$x;           // Now this array contains range `a - zz`

//Step 2:  Provide reference
$str='ab';

//Step 3: Move next or back
echo $values[array_search(strtolower($str),$values)-1];   // Previous = aa
echo $values[array_search(strtolower($str),$values)+1];   // Next     = ac

скрипка

6

Другие решения

Используя массив:

$cla=array('A', 'B', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'R', 'S', 'Š', 'Z', 'Ž', 'T', 'U', 'V', 'Õ', 'Ä', 'Ö', 'Ü');
$direction = -1;
$element = 'Ü';
$element2 = $cla[((array_search($element,$cla)+count($cla)+$direction)%count($cla))];
0

Я мог бы решить таким образом.
Как это?
Минусы в том, что он может обрабатывать только заглавные буквы прямо сейчас.
Еще некоторые работы также могут это исправить.

<?php
function get_previous_letter($string){
$last = substr($string, -1);
$part=substr($string, 0, -1);
if(strtoupper($last)=='A'){
$l = substr($part, -1);
if($l=='A'){
return substr($part, 0, -1)."Z";
}
return $part.chr(ord($l)-1);
}else{
return $part.chr(ord($last)-1);
}
}
echo get_previous_letter("AAAAAA");
?>

CODEPAD

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector