6

如何编写一个函数,给我传递给它的字符的编号

例如,如果功能名称是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

甚至有可能实现这一目标吗?

4

5 回答 5

11

有一个名为ord的函数,它为您提供字符的 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
?>
于 2013-01-16T12:34:03.857 回答
3

效率不是很高,但可以完成工作:

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'and do的东西时$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

演示

于 2013-01-16T12:44:12.293 回答
3

使用范围和 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。

于 2013-01-16T12:36:11.090 回答
1

这是执行您想要的完整代码。

对其进行了测试,并且非常适合您提供的示例。

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;
}
于 2013-01-16T12:34:44.133 回答
0

我认为 ord 应该是一种更有效的方式来获取您的号码:

$string = strtolower($string);
$result = 0;
$length = strlen($string);
foreach($string as $key=>$value){
   $result = ($length -$key - 1)*(ord($value)-ord(a)+1);
}

结果将包含您想要的内容。

于 2013-01-16T17:36:13.240 回答