Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php:将数字转换为字母,反之亦然_Php_String_Function_Math_Reverse - Fatal编程技术网

php:将数字转换为字母,反之亦然

php:将数字转换为字母,反之亦然,php,string,function,math,reverse,Php,String,Function,Math,Reverse,所以我有这个函数: function toAlpha($data){ $alphabet = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'); $alpha_flip = array_flip($alphabet); if($data <= 25){ return $alphab

所以我有这个函数:

function toAlpha($data){
    $alphabet =   array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
    $alpha_flip = array_flip($alphabet);
    if($data <= 25){
      return $alphabet[$data];
    }
    elseif($data > 25){
      $dividend = ($data + 1);
      $alpha = '';
      $modulo;
      while ($dividend > 0){
        $modulo = ($dividend - 1) % 26;
        $alpha = $alphabet[$modulo] . $alpha;
        $dividend = floor((($dividend - $modulo) / 26));
      } 
      return $alpha;
    }
}
函数到alpha($data){
$alphabet=数组('a'、'b'、'c'、'd'、'e'、'f'、'g'、'h'、'i'、'j'、'k'、'l'、'm'、'n'、'o'、'p'、'q'、'r'、's'、't'、'u'、'v'、'w'、'x'、'y'、'z');
$alpha_flip=数组_flip($alphabet);
如果有的话(数据25美元){
美元红利=($data+1);
$alpha='';
$modulo;
而($股息>0){
$modulo=($divident-1)%26;
$alpha=$alphabet[$modulo]。$alpha;
$股息=下限(($股息-$模数)/26));
} 
返回$alpha;
}
}
给定一个数字,将其转换为字符,并且工作正常

但是,我还需要一个反向函数,给定这个函数的任何输出,返回生成该输出所输入的精确输入,我尝试了以下方法:

function toNum($data){
$alphabet =   array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
    $alpha_flip = array_flip($alphabet);
  if(strlen($data) == 1){
          return (isset($alpha_flip[$data]) ? $alpha_flip[$data] : FALSE);
        }
        else if(strlen($data) > 1){
          $num = 1;
          for($i = 0; $i < strlen($data); $i++){
            if(($i + 1) < strlen($data)){
              $num *= (26 * ($alpha_flip[$data[$i]] + 1));
            }
            else{
              $num += ($alpha_flip[$data[$i]] + 1);
            }
          }
          return ($num + 25);
        }
}
函数音调($data){
$alphabet=数组('a'、'b'、'c'、'd'、'e'、'f'、'g'、'h'、'i'、'j'、'k'、'l'、'm'、'n'、'o'、'p'、'q'、'r'、's'、't'、'u'、'v'、'w'、'x'、'y'、'z');
$alpha_flip=数组_flip($alphabet);
if(strlen($data)==1){
返回(isset($alpha_-flip[$data])?$alpha_-flip[$data]:FALSE);
}
否则如果(strlen($data)>1){
$num=1;
对于($i=0;$i
但它不能正常工作…toAlpha(728)生产的是“aba”,而toNum(aba)生产的是1378而不是728

我做错了什么?如何修复反转功能,使其正常工作


提前谢谢

我一点也不明白您试图在该函数中使用的逻辑。您试图做的事情似乎很奇怪(为什么“a”映射到零而“aa”映射到26?),但这似乎是可行的。(您需要使用更多的测试用例,我只检查了它是否为用例“aba”提供了正确的输出。)

函数音调($data){
$alphabet=数组('a'、'b'、'c'、'd'、'e',
‘f’、‘g’、‘h’、‘i’、‘j’,
‘k’、‘l’、‘m’、‘n’、‘o’,
‘p’、‘q’、‘r’、‘s’、‘t’,
‘u’、‘v’、‘w’、‘x’、‘y’,
“z”
);
$alpha_flip=数组_flip($alphabet);
$return_值=-1;
$length=strlen($data);
对于($i=0;$i<$length;$i++){
$return\u值+=
($alpha_flip[$data[$i]]]+1)*功率(26,($length-$i-1));
}
返回$return\u值;
}

您的问题来自您的地图。看看这个:

$alpha[0] = 'Alphabet';
for ($i = 'a'; $i<'z'; $i++) {
    $alpha[] = $i;
}
$alpha[26] = 'z';
$alpha[0]=“字母表”;
对于($i='a';$i
函数toNum($str){
$num=0;
对于($i=0;$i0){
$str=chr($num%26)。$str;
$num=(int)($num/26);
}
返回$str;
} 

这是对toAlpha原始函数的修复。它不适用于toAlpha(27)

函数到alpha($n,$case='upper'){
$alphabet=数组('A'、'B'、'C'、'D'、'E'、'F'、'G'、'H'、'I'、'J'、'K'、'L'、'M'、'N'、'O'、'P'、'Q'、'R'、'S'、'T'、'U'、'V'、'W'、'X'、'Y'、'Z');
$n=$n-1;
Util::错误日志('N'.$N);
若有($26){
$股息=($n);
$alpha='';
$modulo;
而($股息>0){
$modulo=($divident-1)%26;
$alpha=$alphabet[$modulo]。$alpha;
$股息=下限(($股息-$模数)/26));
}
}
如果($case=='lower'){
$alpha=strtolower($alpha);
}
Util::error_log(“****************”$alpha);
返回$alpha;
}

最短路径,在PHP中>=4.1.0

$alphabet=范围('A','Z');
echo$alphabet[3];//返回D
echo数组_search('D',$alphabet);//返回3
从数字到字母表(A=0、B=1等):

您可以使用函数
ord()
从字母表到数字执行相同的操作


将65更改为97,可以获得小写值。

我将“更正”的原始代码删除,并删除调试代码和其他不必要的代码,对其进行了修改,使其可以处理任意数量的字符。例如,希腊文只有24个字符

function toAlpha($number, $alphabet)
    {

        $count = count($alphabet);
        if ($number <= $count) {
            return $alphabet[$number - 1];
        }
        $alpha = '';
        while ($number > 0) {
            $modulo = ($number - 1) % $count;
            $alpha  = $alphabet[$modulo] . $alpha;
            $number = floor((($number - $modulo) / $count));
        }
        return $alpha;
    }

    toAlpha(45,range('a','z'));
将数字转换为字母代码

例如:1402至bax

将字母代码转换成数字

例如:bax至1402

函数alpha-to-u编号($code)
{
$alphabets=数组(“‘a’、‘b’、‘c’、‘d’、‘e’、‘f’、‘g’、‘h’、‘i’、‘j’、‘k’、‘l’、‘m’、‘n’、‘o’、‘p’、‘q’、‘r’、‘s’、‘t’、‘u’、‘v’、‘w’、‘x’、‘y’、‘z”);
$sumval=0;
$code=strtolower(修剪($code));
$arr=str_split($code);
$arr_length=计数($arr);
对于($i=0,$j=$arr_length-1;$i<$arr_length;$i++,$j--)
{
$arr\u value=数组搜索($arr[$i],$alphabets);
$sumval=$sumval+($arr_值*pow(26,$j));
}
返回$sumval;
}

利用西里尔的回答,我为一个不止一个字母的案例详细阐述了一点

function lettersToNumber($letters){
    $alphabet = range('A', 'Z');
    $number = 0;

    foreach(str_split(strrev($letters)) as $key=>$char){
        $number = $number + (array_search($char,$alphabet)+1)*pow(count($alphabet),$key);
    }
    return $number;
}
该功能的一些结果如下所示:

lettersToNumber("A"); //returns 1
lettersToNumber("E"); //returns 5
lettersToNumber("Z"); //returns 26
lettersToNumber("AB"); //returns 28
lettersToNumber("AP"); //returns 42
lettersToNumber("CE"); //returns 83

Theriault在他的评论中提出了一个非常聪明的解决方案

/**
*将整数转换为字母基(A-Z)。
*
*@param int$n这是要转换的数字。
*@return字符串转换后的数字。
*@作者瑟里奥特
* 
*/
函数num2alpha($n){
$r='';
对于($i=1;$n>=0&&$i<10;$i++){
$r=chr(0x41+($n%pow(26,$i)/pow(26,$i-1))。$r;
$n-=战俘(26$i);
}
返回$r;
}
/**
*将字母字符串转换为整数。
*
*@param int$n这是要转换的数字。
*@return字符串转换后的数字。
*@作者瑟里奥特
* 
*/
函数alpha2num($a){
$r=0;
$l=斯特伦($a);
对于($i=0;$i<$l;$i++){
$r+=pow(26,$i)*(作战需求文件($a[$l-$i-1])-0x40);
}
返回$r-1;
}
那怎么办
function toAlpha($n,$case = 'upper'){
    $alphabet   = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
    $n = $n-1;
    Util::error_log('N'.$n);
    if($n <= 26){
        $alpha =  $alphabet[$n-1];
    } elseif($n > 26) {
        $dividend   = ($n);
        $alpha      = '';
        $modulo;
        while($dividend > 0){
            $modulo     = ($dividend - 1) % 26;
            $alpha      = $alphabet[$modulo].$alpha;
            $dividend   = floor((($dividend - $modulo) / 26));
        }
    }

    if($case=='lower'){
        $alpha = strtolower($alpha);
    }
    Util::error_log("**************".$alpha);
    return $alpha;

}
function toAlpha($num){
    return chr(substr("000".($num+65),-3));
}
function toAlpha($number, $alphabet)
    {

        $count = count($alphabet);
        if ($number <= $count) {
            return $alphabet[$number - 1];
        }
        $alpha = '';
        while ($number > 0) {
            $modulo = ($number - 1) % $count;
            $alpha  = $alphabet[$modulo] . $alpha;
            $number = floor((($number - $modulo) / $count));
        }
        return $alpha;
    }

    toAlpha(45,range('a','z'));
// lower greek
$range = ['α', 'β', 'γ', 'δ', 'ε', 'ζ', 'η', 'θ', 'ι', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'π', 'ρ', 'σ', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω'];
// upper greek 
$range = ['Α', 'Β', 'Γ', 'Δ', 'Ε', 'Ζ', 'Η', 'Θ', 'Ι', 'Κ', 'Λ', 'Μ', 'Ν', 'Ξ', 'Ο', 'Π', 'Ρ', 'Σ', 'Τ', 'Υ', 'Φ', 'Χ', 'Ψ', 'Ω'];
// georgian 
$range = ['ჵ' => 10000, 'ჰ' => 9000, 'ჯ' => 8000, 'ჴ' => 7000, 'ხ' => 6000, 'ჭ' => 5000, 'წ' => 4000, 'ძ' => 3000, 'ც' => 2000, 'ჩ' => 1000, 'შ' => 900, 'ყ' => 800, 'ღ' => 700, 'ქ' => 600, 'ფ' => 500, 'ჳ' => 400, 'ტ' => 300, 'ს' => 200, 'რ' => 100, 'ჟ' => 90, 'პ' => 80, 'ო' => 70, 'ჲ' => 60, 'ნ' => 50, 'მ' => 40, 'ლ' => 30, 'კ' => 20, 'ი' => 10, 'თ' => 9, 'ჱ' => 8, 'ზ' => 7, 'ვ' => 6, 'ე' => 5, 'დ' => 4, 'გ' => 3, 'ბ' => 2, 'ა' => 1];
function number_to_alpha($num, $code)
{   
    $alphabets = array('', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');

    $division = floor($num / 26);
    $remainder = $num % 26; 

    if($remainder == 0)
    {
        $division = $division - 1;
        $code .= 'z';
    }
    else
        $code .= $alphabets[$remainder];

    if($division > 26)
        return number_to_alpha($division, $code);   
    else
        $code .= $alphabets[$division];     

    return strrev($code);
}
function alpha_to_number($code)
{
    $alphabets = array('', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');

    $sumval = 0;

    $code = strtolower(trim($code));

    $arr = str_split($code);
    $arr_length = count($arr);

    for($i = 0, $j = $arr_length-1; $i < $arr_length; $i++, $j--)
    {
        $arr_value = array_search($arr[$i], $alphabets);
        $sumval = $sumval + ($arr_value * pow(26, $j));
    }

    return $sumval;
}
function lettersToNumber($letters){
    $alphabet = range('A', 'Z');
    $number = 0;

    foreach(str_split(strrev($letters)) as $key=>$char){
        $number = $number + (array_search($char,$alphabet)+1)*pow(count($alphabet),$key);
    }
    return $number;
}
lettersToNumber("A"); //returns 1
lettersToNumber("E"); //returns 5
lettersToNumber("Z"); //returns 26
lettersToNumber("AB"); //returns 28
lettersToNumber("AP"); //returns 42
lettersToNumber("CE"); //returns 83
/**
* Converts an integer into the alphabet base (A-Z).
*
* @param int $n This is the number to convert.
* @return string The converted number.
* @author Theriault
* 
*/
function num2alpha($n) {
    $r = '';
    for ($i = 1; $n >= 0 && $i < 10; $i++) {
    $r = chr(0x41 + ($n % pow(26, $i) / pow(26, $i - 1))) . $r;
    $n -= pow(26, $i);
    }
    return $r;
}
/**
* Converts an alphabetic string into an integer.
*
* @param int $n This is the number to convert.
* @return string The converted number.
* @author Theriault
* 
*/
function alpha2num($a) {
    $r = 0;
    $l = strlen($a);
    for ($i = 0; $i < $l; $i++) {
    $r += pow(26, $i) * (ord($a[$l - $i - 1]) - 0x40);
    }
    return $r - 1;
}
function toLetter(int $num) {
    return strtoupper(base_convert($num + 9), 10, 36);
}