2012-08-17 53 views
2

我需要用字母数字增量生成一个序列(或函数来获得“下一个id”)。字母数字在PHP中增加一个字符串(一定长度)

字符串的长度必须是可以定义的,字符必须是0-9,A-Z。

因此,例如,具有长度为3:

000 
001 
002 
~ 
009 
00A 
00B 
~ 
00Z 
010 
011 
etc.. 

所以我想象的功能可以使用这样的:

$code = '009' 
$code = getNextAlphaNumeric($code); 
ehco $code; // '00A' 

我正在努力解决这个我自己,但好奇的是,如果有人已经解决了这个问题,并提出一个比我自己更聪明/更强大的解决方案。

有没有人有一个很好的解决这个问题?

+3

你尝试过什么或者你只是要我们写代码的吗? – Niko 2012-08-17 06:53:17

+0

我只是坐下来写下来,但认为“这是别人在过去可能比我做得更好的事情!”所以我在这里发布了它,并试图“为社区赛跑”。社区赢了。 – 2012-08-17 07:03:53

+0

+1给你...... – mrsrinivas 2012-08-17 07:30:55

回答

6

会像base_convert一样工作吗?也许沿着这些线路(未经测试)

function getNextAlphaNumeric($code) { 
    $base_ten = base_convert($code,36,10); 
    return base_convert($base_ten+1,10,36); 
} 

的想法是,你的代码都是真的只是一个基地36号,让你转换该基地36号为10进制,把它加1,然后将其转换回基地36并且返回它。

编辑:刚才意识到可能有一个任意字符串长度的代码,但是这种方法可能仍然可行 - 如果你先捕获所有的前导零,然后剥离它们,做基地36 - >基地10位的转换,增加一个,并添加回任何需要的前导零...

+0

几乎看起来那里,http://codepad.org/ghGIdHfz我只是调整大写和填充... – 2012-08-17 06:59:26

+3

正确答案:http://codepad.org/tzzAq1z8谢谢! – 2012-08-17 07:02:23

+0

大+1为您的伟大和智能代码 – mrsrinivas 2012-08-17 07:31:42

1

我会做这样的事情:

getNextChar($character) { 
    if ($character == '9') { 
     return 'A'; 
    } 
    else if ($character == 'Z') { 
     return '0'; 
    } 
    else { 
     return chr(ord($character) + 1); 
    } 
} 

getNextCode($code) { 
    // reverse, make into array 
    $codeRevArr = str_split(strrev($code)); 

    foreach($codeRevArr as &$character) { 
     $character = getNextChar($character); 
     // keep going down the line if we're moving from 'Z' to '0' 
     if ($character != '0') { 
      break; 
     } 
    } 

    // array to string, then reverse again 
    $newCode = strrev(implode('', $codeRevArr)); 
    return $newCode; 
} 
+0

不错的尝试,我实际上是通过写一个非常类似的方法中途! http://codepad.org/nt85GS3V jlmcdonald在我完成之前跳过了一个更好的答案:) – 2012-08-17 07:08:31

+0

如果你有兴趣,我坚持使用add/carry的一般解决方案。 – Adam 2012-08-17 07:39:17

1

我感兴趣的是更普遍的解决了这一问题 - 即处理任意以任意顺序设置字符集。我发现最简单的方法是首先转换为字母索引并返回。

function getNextAlphaNumeric($code, $alphabet) { 

    // convert to indexes 
    $n = strlen($code); 
    $trans = array(); 
    for ($i = 0; $i < $n; $i++) { 
    $trans[$i] = array_search($code[$i], $alphabet); 
    } 

    // add 1 to rightmost pos 
    $trans[$n - 1]++; 

    // carry from right to left 
    $alphasize = count($alphabet); 
    for ($i = $n - 1; $i >= 0; $i--) { 
    if ($trans[$i] >= $alphasize) { 
     $trans[$i] = 0; 
     if ($i > 0) { 
     $trans[$i -1]++; 
     } else { 
     // overflow 
     } 
    } 
    } 

    // convert back 
    $out = str_repeat(' ', $n); 
    for ($i = 0; $i < $n; $i++) { 
    $out[$i] = $alphabet[$trans[$i]]; 
    } 

    return $out; 
} 

$alphabet = array(); 
for ($i = ord('0'); $i <= ord('9'); $i++) { 
    $alphabet[] = chr($i); 
} 
for ($i = ord('A'); $i <= ord('Z'); $i++) { 
    $alphabet[] = chr($i); 
} 

echo getNextAlphaNumeric('009', $alphabet) . "\n"; 
echo getNextAlphaNumeric('00Z', $alphabet) . "\n"; 
echo getNextAlphaNumeric('0ZZ', $alphabet) . "\n"; 
1
<?php 
define('ALPHA_ID_LENGTH', 3); 

class AlphaNumericIdIncrementor { 
// current id 
protected $_id; 

/** 
    * check if id is valid 
    * 
    * @param string $id 
    * @return bool 
    **/ 
protected static function _isValidId($id) { 
    if(strlen($id) > ALPHA_ID_LENGTH) { 
    return false; 
    } 

    if(!is_numeric(base_convert($id, 36, 10))) { 
    return false; 
    } 

    return true; 
} 

/** 
    * format $id 
    * fill with leading zeros and transform to uppercase 
    * 
    * @param string $id 
    * @return string 
    **/ 
protected static function _formatId($id) { 
    // fill with leading zeros 
    if(strlen($id) < ALPHA_ID_LENGTH) { 
    $zeros = ''; 

    for($i = 0; $i < ALPHA_ID_LENGTH - strlen($id); $i++) { 
    $zeros .= '0'; 
    } 

    $id = strtoupper($zeros . $id); 
    } else { 
    $id = strtoupper($id); 
    } 

    return $id; 
} 

/** 
    * construct 
    * set start id or null, if start with zero 
    * 
    * @param string $startId 
    * @return void 
    * @throws Exception 
    **/ 
public function __construct($startId = null) { 
    if(!is_null($startId)) { 
    if(self::_isValidId($startId)) { 
    $this->_id = $startId; 
    } else { 
    throw new Exception('invalid id'); 
    } 
    } else { 
    $this->_generateId(); 
    } 
} 

/** 
    * generate start id if start id is empty 
    * 
    * @return void 
    **/ 
protected function _generateId() { 
    $this->_id = self::_formatId(base_convert(0, 10, 36)); 
} 

/** 
    * return the current id 
    * 
    * @return string 
    **/ 
public function getId() { 
    return $this->_id; 
} 

/** 
    * get next free id and increment $this->_id 
    * 
    * @return string 
    **/ 
public function getNextId() { 
    $this->_id = self::_formatId(base_convert(base_convert($this->_id, 36, 10) + 1, 10, 36)); 

    return $this->_id; 
} 
} 

$testId = new AlphaNumericIdIncrementor(); 
echo($testId->getId() . '<br />'); // 000 
echo($testId->getNextId() . '<br />'); // 001 

$testId2 = new AlphaNumericIdIncrementor('A03'); 
echo($testId2->getId() . '<br />'); // A03 
echo($testId2->getNextId() . '<br />'); // A04 

$testId3 = new AlphaNumericIdIncrementor('ABZ'); 
echo($testId3->getId() . '<br />'); // ABZ 
echo($testId3->getNextId() . '<br />'); // AC0 
?> 
0
function formatPackageNumber($input) 
{ 
    //$input = $_GET['number']; 

    $alpha_array = 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"); 
    $number_array = array("0", "1" , "2", "3", "4", "5", "6", "7", "8", "9"); 
    $output = ""; 

    for($i=0; $i<=5; $i++){ 
    if($i>=4) { 
     $divisor = pow(26,$i-3)*pow(10,3); 
    } else { 
     $divisor = pow(10,$i); 
    } 
    $pos = floor($input/$divisor); 

    if($i>=3) { 
     $digit = $pos%26; 
     $output .= $alpha_array[$digit]; 
    } else { 
     $digit = $pos%10 ; 
     $output .= $number_array[$digit]; 
    } 
    } 
return strrev($output); 

}

相关问题