函数,该函数使用PHP将以36为基数的字符串转换为以10为基数的整数

函数,该函数使用PHP将以36为基数的字符串转换为以10为基数的整数,php,Php,有人能告诉我如何编写一个php函数,在不使用base convert函数的情况下,将以36为基数的字符串转换为以10为基数的整数吗 函数应该是这样工作的 echo base36_to_base10('614qa'); //prints 10130482 echo base36_to_base10('614z1'); //prints 10130797 只需使用本机函数: echo base_convert('614qa', 36, 10); 或者,如果您愿意: function base3

有人能告诉我如何编写一个php函数,在不使用base convert函数的情况下,将以36为基数的字符串转换为以10为基数的整数吗

函数应该是这样工作的

echo base36_to_base10('614qa'); //prints 10130482 
echo base36_to_base10('614z1'); //prints 10130797
只需使用本机函数:

echo base_convert('614qa', 36, 10);
或者,如果您愿意:

function base36to10($value) {
  return base_convert($value, 36, 10);
}
如果您不能或不想使用
base\u convert
,应该这样做:

function base36to10($value) {
    // check for correct input
    if (preg_match('/^[0-9A-Z]+$/i', $value) == 0) {
        return NULL;
    }

    // reverse and change to uppercase
    $value = strtoupper(strrev($value));

    // converted value
    $converted = 0;

    // cycle on character
    for ($c = 0, $l = strlen($value); $c < $l; ++$c) {
        // if the character is a digit
        if (ctype_digit($value[$c])) {
            // convert directly
            $v = (int) $value[$c];
        }
        // else convert ascii value
        else {
            $v = ord($value[$c]) - 55; // -55 == 10 - 65
        }

        // add to converted
        $converted += $v * pow(36, $c);
    }

    // now return
    return $converted;
}
函数基36到10($value){
//检查输入是否正确
如果(预匹配('/^[0-9A-Z]+$/i',$value)==0){
返回NULL;
}
//反转并改为大写
$value=strtoupper(strrev$value));
//换算值
$converted=0;
//字符循环
对于($c=0,$l=strlen($value);$c<$l;+$c){
//如果字符是数字
if(ctype_数字($value[$c])){
//直接转换
$v=(int)$value[$c];
}
//else转换ascii值
否则{
$v=ord($value[$c])-55;//-55==10-65
}
//添加到已转换的
$converted+=$v*pow(36$c);
}
//现在返回
返回已转换的美元;
}

使用符号数组的选项略有不同:

function base36_to_base10($input) {
    $symbols = array('0','1','2','3','4','5','6','7','8','9','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');

    //flip the array so symbols are keys (or just write it that way to begin with)
    $symbols = array_flip($symbols);

    // reverse input string and convert to array
    // (reversing the string simplifies incrementing place value as you iterate it)
    $x = str_split(strrev($input));

    $sum = 0;
    foreach ($x as $place => $symbol) {
        // increment sum with base 10 representation of base 36 place value
        $sum += $symbols[$symbol] * pow(36, $place);
        // or with PHP 5.6+ 
        //$sum += $symbols[$symbol] * 36 ** $place;
    }
    return $sum;
}
它是如何与您的一个示例一起工作的:

反向输入=614qa->aq416
初始化和=0
a->10,10*36^0=10,总和+10=10
q->26,26*36^1=936,和+936=946
4->4,4*36^2=5184,和+5184=6130
1->1,1*36^3=46656,和+46656=52786
6->6,6*36^4=10077696,和+10077696=10130482

欢迎继续,您可能需要阅读,以便改进您的问题如果要避免使用
base\u convert
函数,您可能需要解释原因。如果这是一个家庭作业的问题,你应该考虑编辑你的问题,包括你所尝试的和为什么它不工作。这并不是说这是一项任务,但我是php新手,我需要一点帮助来理解如何解决更大的问题,我不能使用base_convert当你的答案有效时,原来的海报确实要求一种没有
base_convert
@xorif的方法哦,天哪,你说得对!在途中编辑…这是一个愚蠢的限制,所以应该忽略,除非解释为什么不将其转换为-55的高级护理?在CPU方面,它的效率更高,因为大写字母位于小写字母的前面。而且,它的效果和预期一样,我不确定我是否得到了它,为什么大写会更好,除了要减去的不同常数?