如何编写一个函数,为我提供传递给它的字符数
例如,如果功能名称为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
甚至可以实现这个目标吗?
答案 0 :(得分: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
?>
答案 1 :(得分: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。
答案 2 :(得分: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
答案 3 :(得分: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;
}
答案 4 :(得分:0)
我认为ord应该是一种更有效的方式来获得你的号码:
$string = strtolower($string);
$result = 0;
$length = strlen($string);
foreach($string as $key=>$value){
$result = ($length -$key - 1)*(ord($value)-ord(a)+1);
}
,结果将包含您想要的内容。