Функция PHP для получения номера символа
как я могу написать функцию, которая дает мне номер символа, который передается в его
например, если имя funciton GetCharacterNumber
и я B
тогда он должен дать мне 2
GetCharacterNumber("A") // should print 1
GetCharacterNumber("C") // should print 3
GetCharacterNumber("Z") // should print 26
GetCharacterNumber("AA") // should print 27
GetCharacterNumber("AA") // should print 27
GetCharacterNumber("AC") // should print 29
возможно ли вообще достичь этого ?
5 ответов
не очень эффективно, но получает работу:
function get_character_number($end)
{
$count = 1;
$char = 'A';
$end = strtoupper($end);
while ($char !== $end) {
$count++;
$char++;
}
return $count;
}
echo get_character_number('AA'); // 27
это работает, потому что когда у тебя есть что-то вроде $char = 'A'
и $char++
, он изменится на "B", затем "C", "D", ... "Z", "AA", " AB " и так далее.
обратите внимание, что это станет медленнее, чем дольше $end
есть. Я бы не рекомендовал это ни для чего, кроме "ZZZZ" (475254 итераций), или если вам нужно много таких поисков.
лучше выполнять альтернативой было бы
function get_character_number($string) {
$number = 0;
$string = strtoupper($string);
$dictionary = array_combine(range('A', 'Z'), range(1, 26));
for ($pos = 0; isset($string[$pos]); $pos++) {
$number += $dictionary[$string[$pos]] + $pos * 26 - $pos;
}
return $number;
}
echo get_character_number(''), PHP_EOL; // 0
echo get_character_number('Z'), PHP_EOL; // 26
echo get_character_number('AA'), PHP_EOL; // 27
существует функция под названием ОГА который дает вам номер ASCII символа.
ord($chr) - ord('A') + 1
дает правильный результат для одного персонажа. Для более длинных строк можно использовать цикл.
<?php
function GetCharacterNumber($str) {
$num = 0;
for ($i = 0; $i < strlen($str); $i++) {
$num = 26 * $num + ord($str[$i]) - 64;
}
return $num;
}
GetCharacterNumber("A"); //1
GetCharacterNumber("C"); //3
GetCharacterNumber("Z"); //26
GetCharacterNumber("AA"); //27
GetCharacterNumber("AC"); //29
GetCharacterNumber("BA"); //53
?>
используйте диапазон и strpos:
$letter = 'z';
$alphabet = range('a', 'z');
$position = strpos($alphabet, $letter);
для двойных букв (например, zz) вам, вероятно, нужно будет создать свой собственный алфавит, используя пользовательскую функцию:
$alphabet = range('a', 'z');
$dictionary = range('a','z');
foreach($alphabet AS $a1){
foreach($alphabet AS $a2) {
$dictionary[] = $a1 . $a2;
}
}
затем используйте $dictionary вместо $alphabet.
вот полный код, который делает то, что вы хотите.
протестировал его и отлично работает для приведенных вами примеров.
define('BASE', 26);
function singleOrd($chr) {
if (strlen($chr) == 1) {
return (ord($chr)-64);
} else{
return 0;
}
}
function multiOrd($string) {
if (strlen($string) == 0) {
return 0;
} elseif (strlen($string) == 1) {
return singleOrd($string);
} else{
$sum = 0;
for($i = strlen($string) - 1; $i >= 0; $i--) {
$sum += singleOrd($string[$i]) * pow(BASE, $i);
}
}
return $sum;
}
Я думаю, что ord должен быть более эффективным способом получить ваш номер:
$string = strtolower($string);
$result = 0;
$length = strlen($string);
foreach($string as $key=>$value){
$result = ($length -$key - 1)*(ord($value)-ord(a)+1);
}
и результат будет содержать то, что вы хотите.