不使用0..9符号,而使用0..9A..Z符号
不使用base-10系统,而使用base-64系统
我想创建一个如下示例所示的函数:
next('ABC')返回'ACA‘-这是包含3个单元的下一个字符串
这就像我们有从0到9的数字,函数返回下一个数字
next2(135)返回值136 -这是下一个3位数字
我们对数字使用10进制,我想使用数字字母,这意味着36进制,并得到下一个所谓的数字
发布于 2011-02-05 17:24:44
下面是一个函数,它生成以3为基数的字母数字系统中的下一个值:
function nextval($input, $pad = 1) {
$map = array(0 => 'A', 1 => 'B', 2 => 'C');
//convert letters to numbers
$num = '';
for ($i = 0; $i < strlen($input); $i++) {
$num .= array_search($input{$i}, $map);
}
//convert the number to base 10, then add 1 to it
$base10 = base_convert($num, 3, 10);
$base10++;
//convert back to base 3
$base3 = base_convert($base10, 10, 3);
//swap the digits back to letters
$num = '';
for ($i = 0; $i < strlen($base3); $i++) {
$num .= $map[$base3{$i}];
}
//pad with leading A's
while (strlen($num) < $pad) {
$num = 'A' . $num;
}
return $num;
}
echo nextval('ABC', 3); //ACA请注意,结果是"CA“,因为"ACA”与在base-10中写入"06“相同...我们通常不写前导零,所以你不会写前导“A”。
因此,我添加了一个pad参数,它允许您指定要填充的位数。使用$pad=3,你会得到"ACA“作为"ABC”的下一个。
发布于 2011-02-05 17:30:28
像这样的东西
<?php
function toNext($input) {
$conv = strtr(strtolower($input), array(
'a' => '0',
'b' => '1',
'c' => '2' ));
$conv = base_convert($conv, 3, 10);
$conv++;
$output = base_convert($conv, 10, 3);
$output = sprintf("%03d", $output);
$output = strtr((string) $output, array(
'0' => 'a',
'1' => 'b',
'2' => 'c' ));
return strtoupper($output);
}
var_dump(toNext('ABC'));
var_dump(toNext('ABA'));发布于 2011-02-05 17:19:08
我现在能想到的一种方法是将字符转换为base26,然后将数字加1,然后再将其转换回来,希望你能理解。Next2应该做同样的事情,但是使用base10,这是默认的,所以这将是数字本身的+1。我期待着看到这个版本上的其他实现。
编辑:我没有注意到你的结尾有A。我真傻,竟然做那件事。那就是base3,而不是26。
https://stackoverflow.com/questions/4906045
复制相似问题