如何在 php 中生成一个混合数字、小写和大写字母的增量 id?
例如,我尝试了:
$hello = "aaa0";
for ($i=0; $i < 10000; $i++) {
echo $hello++;
echo "<br>";
}
然后,它返回;
aaa0
aaa1
aaa2
...
aaa9
aab0
aab1
我想生成字符串为:
aaa0
aaa1
aaa2
...
aaaa
aaab
aaac
...
aaaz
aaaA
首先是 0 到 9 的数字,然后是 a 到 z 的字符,然后是 A 到 Z 的字符。每个位置字符都应在此范围内。
我该怎么做?
编辑:我希望字符串中的每个字符都在此范围内变化。我想从 0 到 9,然后从 a 到 z,然后从 A 到 Z。当它结束时,字符变为 0,左侧的字符递增 1。例如:
0000
0001
0002
...
0009
000a
000b
...
000y
000z
000A
000B
...
000X
000Z
0010
0011
0012
....
0019
001a
这应该适合您:
<?php
$hello = "aaa";
//'aaa0' -> 'aaa9'
for ($count = 0; $count <= 9; $count++)
echo $hello . $count . "<br />";
//'aaaa' -> 'aaaz'
foreach (range('a', 'z') as $char)
echo $hello . $char . "<br />";
//'aaaA' -> 'aaaZ'
foreach (range('A', 'Z') as $char)
echo $hello . $char . "<br />";
?>
编辑:
这仅适用于 3 位数字。在您肯定用完内存之后。
<?php
$array = array();
$maxLength = 3;
$output = array();
ini_set('memory_limit', '-1');
$time_start = microtime(true);
foreach(range(0, 9) as $number)
$array[] = $number;
foreach(range('a', 'z') as $char)
$array[] = $char;
foreach(range('A', 'Z') as $char)
$array[] = $char;
function everyCombination($array, $arrLength, $size, $perArr = array(), $pos = 0, &$found = array()) {
if ($size == $pos) {
$found[] = vsprintf("%s%s%s", $perArr);
return;
}
for ($count = 0; $count < $arrLength; $count++) {
$perArr[$pos] = $array[$count];
everyCombination($array, $arrLength, $size, $perArr, $pos+1, $found);
}
return $found;
}
$output = everyCombination($array, count($array), $maxLength);
for($count = 0; $count < count($output); $count++)
echo $output[$count] . "<br/>";
echo "DONE!";
$time_end = microtime(true);
$time = $time_end - $time_start;
echo round($time,2) . " s";
?>
使用 0,1-9,a-z 和 A-Z 是"基数 62"。在 PHP 中,从基数 10 转换为基数 62 非常容易。
<?php
echo base_convert(10123, 10,26), "'n";
// outputs: 'ep9'
echo base_convert('ep9', 26, 10), "'n";
// output 10123
base_convert仅支持从base2到base36的转换。
如果强度只是在base62(0-9 a-z A-Z)中递增,那么只需简单的算术增量(CPU的方式)就足够了。
我们将 LSB(最低有效位/位)递增1,然后如果它溢出,则递增下一个 LSB,直到达到 MSB(最高有效位/位)。如果仍有溢出,请在前面加 1(不是零)。
注意:前导零在算术中没有意义,因此000a
与a
相同。 如果需要零填充,请稍后添加。
注意:Base62 中的数字顺序是 0-9
,A-Z
然后是 a-z
(与 ASCII 表相同)。如果要将其更改为 0-9
,a-z
那么A-Z
则需要更改GMP
字符串
const GMP = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
function NextB62Digit(string $data): string {
$i = strpos(GMP, $data);
if (($i !== NULL) && $i != 61 /*strlen(GMP) - 1*/) {
return GMP[$i + 1];
} else {
return "0";
}
}
function Base62Increment(string $data): string {
$out = "";
$overflow = true;
$i = strlen($data) - 1;
while ($i > -1) {
if ($overflow) {
$thisDigit = NextB62Digit($data[$i]);
if ($thisDigit !== '0'){
$overflow = false;
}
} else {
$thisDigit = $data[$i];
}
$out = $thisDigit . $out;
$i--;
}
if ($overflow) {
$out = '1' . $out;
}
return $out;
}
测试
echo "<pre>";
echo Base62Increment( "1") . "'n"; // 2
echo Base62Increment( "9") . "'n"; // A
echo Base62Increment( "z") . "'n"; // 10
echo Base62Increment("000a") . "'n"; // b
echo Base62Increment("000Z") . "'n"; // a
echo Base62Increment("aaaz") . "'n"; // aab0
echo Base62Increment("zzzz") . "'n"; // 10000
echo "</pre>";