【问题标题】:PHP Convert a string primary key to a number representationPHP将字符串主键转换为数字表示
【发布时间】:2018-05-25 08:14:26
【问题描述】:

我从一个表中获取了这个 ID:

“B0AL02087”

如何将此字母数字 id 转换为整数表示?我期待“B0AL02087”类似于“2011202087”。

我找到了一种方法,使用带有字符串拆分的字母范围,字母表中字母的索引会切换键中的字母:

$alphabet = range('A', 'Z');
$arr = str_split("B0AL02087");
$arr[0] = array_search($arr[0], $alphabet);
$arr[2] = array_search($arr[2], $alphabet);
$arr[3] = array_search($arr[3], $alphabet);
implode($arr), '0');

但是这种方法只有在你指定 $arr 的索引时才有效,这意味着当表中 id 的格式发生变化时它不起作用,例如

“BBAL02087”

现在我们在字符串的开头有两个字母,而不是像第一个字母那样是一个字母和一个整数。我可以写一堆 if 语句检查每个索引是否包含一个数字。我只是不确定是否有更好的方法来做到这一点。

【问题讨论】:

  • 是否将其转换为二进制工作?这将是一个完整的数字表示,并且是可逆的.. stackoverflow.com/questions/6382738/…
  • 代替 数字 的 void 规范,也许说明目的,这样人们就不必蒙着眼睛射飞镖。
  • 你可以使用ord()来获取每个字母的ascii整数值。
  • 您要将其转换为数字的目的是什么?
  • 这个要求的最终解决方案是将数字从 36 进制转换为十进制(10 进制)。这将避免碰撞。

标签: php


【解决方案1】:

不太确定您要实现什么,但使用您提供的示例,您可以简单地使用:

str_replace(range('A', 'Z'), range(1, 26), Syour_id)

B0AL02087 将返回:2011202087

BBAL02087 将返回:2211202087

【讨论】:

  • 您可以删除您想要的范围调用之一。 str_replace(($range = range('A', 'Z')), array_keys($range), Syour_id);
  • 想到了,但它会将A 替换为0,这对于数字表示不是很方便,例如A320AAA320 的表示都等于320,使用range (1, 26),表示将分别为 1320111320
  • @mrbm 这个解决方案有一点限制,假设以下两个输入:AAA320A11320 这里两个不同的值将返回相同的 id,即发生冲突!
【解决方案2】:

正如我在之前的评论中所提到的,执行这种转换的最终方法是从基础转换到基础,再转换为 void 碰撞

来自this article,它正在谈论将数字从基数转换为另一个数,以及从任何基数转换为十进制基数 10 的描述。我已经使用 实现了解决方案,该解决方案将其假定为基数 36,即0-9 A-Z,以十进制为底的数字,可以轻松转换为 代码:

baseStr = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  function baseToDec(val){
    n = val.length;
    b = baseStr.length
    s = 0;
    for (i =0; i < val.length; i++){
      n--;
      s = s + (baseStr.indexOf(val[i])*(Math.pow(b,n))); 
        // The non numerical values, such as E or Q could
       // not be multiplied, so we used its index in the baseStr
    }
    return s;
  }

这是一个jsbin demo 和这个an online service 进行这样的对话以批准,以某种方式,该代码工作正常,因为它给出了与演示相同的结果。

更新

以下是PHP的实现:

<?php
  function baseToDec($val){
    $baseStr = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $n = strlen($val);
    $b = strlen($baseStr);
    $s = 0;
   // var_dump($n);
    for ($i =0; $i < strlen($val); $i++){
      $n--;
      $s = $s + (strpos($baseStr,$val[$i])*($b**$n)); 
        // The non numerical values, such as E or Q could
       // not be multiplied, so we used its index in the $baseStr
    }
    return $s;
  }
  echo baseToDec('A11320');

ideone 演示。

【讨论】:

    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 2013-05-12
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    相关资源
    最近更新 更多