首页 >后端开发 >php教程 >PHP实现把数字ID转字母ID的方法

PHP实现把数字ID转字母ID的方法

小云云
小云云原创
2018-03-15 09:07:072554浏览

本文主要和大家分享PHP实现把数字ID转字母ID的方法,希望能帮助到大家。

alphaID(12354);  //会将数字转换为字母。  
alphaID('PpQXn7COf',true);
//会将字母ID转换为对应的数字。  
alphaID(12354,false,6);//指定生成字母ID的长度为6.
<?php  
/** 
 * Translates a number to a short alhanumeric version 
 * 
 * Translated any number up to 9007199254740992 
 * to a shorter version in letters e.g.: 
 * 9007199254740989 --> PpQXn7COf 
 * 
 * specifiying the second argument true, it will 
 * translate back e.g.: 
 * PpQXn7COf --> 9007199254740989 
 * 
 * this function is based on any2dec && dec2any by 
 * fragmer[at]mail[dot]ru 
 * see: http://nl3.php.net/manual/en/function.base-convert.php#52450 
 * 
 * If you want the alphaID to be at least 3 letter long, use the 
 * $pad_up = 3 argument 
 * 
 * In most cases this is better than totally random ID generators 
 * because this can easily avoid duplicate ID&#39;s. 
 * For example if you correlate the alpha ID to an auto incrementing ID 
 * in your database, you&#39;re done. 
 * 
 * The reverse is done because it makes it slightly more cryptic, 
 * but it also makes it easier to spread lots of IDs in different 
 * directories on your filesystem. Example: 
 * $part1 = substr($alpha_id,0,1); 
 * $part2 = substr($alpha_id,1,1); 
 * $part3 = substr($alpha_id,2,strlen($alpha_id)); 
 * $destindir = "/".$part1."/".$part2."/".$part3; 
 * // by reversing, directories are more evenly spread out. The 
 * // first 26 directories already occupy 26 main levels 
 * 
 * more info on limitation: 
 * - http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/165372 
 * 
 * if you really need this for bigger numbers you probably have to look 
 * at things like: http://theserverpages.com/php/manual/en/ref.bc.php 
 * or: http://theserverpages.com/php/manual/en/ref.gmp.php 
 * but I haven&#39;t really dugg into this. If you have more info on those 
 * matters feel free to leave a comment. 
 * 
 * @author  Kevin van Zonneveld <kevin@vanzonneveld.net> 
 * @author  Simon Franz 
 * @author  Deadfish 
 * @copyright 2008 Kevin van Zonneveld (http://kevin.vanzonneveld.net) 
 * @license   http://www.opensource.org/licenses/bsd-license.php New BSD Licence 
 * @version   SVN: Release: $Id: alphaID.inc.php 344 2009-06-10 17:43:59Z kevin $ 
 * @link    http://kevin.vanzonneveld.net/ 
 * 
 * @param mixed   $in    String or long input to translate 
 * @param boolean $to_num  Reverses translation when true 
 * @param mixed   $pad_up  Number or boolean padds the result up to a specified length 
 * @param string  $passKey Supplying a password makes it harder to calculate the original ID 
 * 
 * @return mixed string or long 
 */  
function alphaID($in, $to_num = false, $pad_up = false, $passKey = null)  
{  
  $index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";  
  if ($passKey !== null) {  
    // Although this function&#39;s purpose is to just make the  
    // ID short - and not so much secure,  
    // with this patch by Simon Franz (http://blog.snaky.org/)  
    // you can optionally supply a password to make it harder  
    // to calculate the corresponding numeric ID  

    for ($n = 0; $n<strlen($index); $n++) {  
      $i[] = substr( $index,$n ,1);  
    }  

    $passhash = hash(&#39;sha256&#39;,$passKey);  
    $passhash = (strlen($passhash) < strlen($index))  
      ? hash(&#39;sha512&#39;,$passKey)  
      : $passhash;  

    for ($n=0; $n < strlen($index); $n++) {  
      $p[] =  substr($passhash, $n ,1);  
    }  

    array_multisort($p,  SORT_DESC, $i);  
    $index = implode($i);  
  }  

  $base  = strlen($index);  

  if ($to_num) {  
    // Digital number  <<--  alphabet letter code  
    $in  = strrev($in);  
    $out = 0;  
    $len = strlen($in) - 1;  
    for ($t = 0; $t <= $len; $t++) {  
      $bcpow = bcpow($base, $len - $t);  
      $out   = $out + strpos($index, substr($in, $t, 1)) * $bcpow;  
    }  

    if (is_numeric($pad_up)) {  
      $pad_up--;  
      if ($pad_up > 0) {  
        $out -= pow($base, $pad_up);  
      }  
    }  
    $out = sprintf(&#39;%F&#39;, $out);  
    $out = substr($out, 0, strpos($out, &#39;.&#39;));  
  } else {  
    // Digital number  -->>  alphabet letter code  
    if (is_numeric($pad_up)) {  
      $pad_up--;  
      if ($pad_up > 0) {  
        $in += pow($base, $pad_up);  
      }  
    }  

    $out = "";  
    for ($t = floor(log($in, $base)); $t >= 0; $t--) {  
      $bcp = bcpow($base, $t);  
      $a   = floor($in / $bcp) % $base;  
      $out = $out . substr($index, $a, 1);  
      $in  = $in - ($a * $bcp);  
    }  
    $out = strrev($out); // reverse  
  }  

  return $out;  
}

相关推荐:

PHP实现把数字ID转字母ID_PHP教程

以上是PHP实现把数字ID转字母ID的方法的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn