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

文字のASCII番号を与えるordと呼ばれる関数があります。

ord($chr) - ord('A') + 1

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

範囲と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;
    }
}

次に、$alphabetの代わりに$dictionaryを使用します。

于 2013-01-16T12:36:11.090 に答える
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'$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 に答える
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 に答える