我希望使用PHP创建一个自动递增的唯一字符串,包含[a-Z 0-9],从2个字符开始,并在需要时增长。
这是针对网址缩小器,因此每个字符串(或别名)都将保存在附加到网址的数据库中。
非常感谢任何见解!
答案 0 :(得分:2)
请注意,此解决方案不会生成大写字母。
使用base_convert()
转换为基数36,它将使用[a-z0-9]。
<?php
// outputs a, b, c, ..., 2o, 2p, 2q
for ($i = 10; $i < 99; ++$i)
echo base_convert($i, 10, 36), "\n";
给定上次使用的数字,您可以将其转换回intval()
递增的整数,并使用base_convert()
将结果转换回基数36。
<?php
$value = 'bc9z';
$value = intval($value, 36);
++$value;
$value = base_convert($value, 10, 36);
echo $value; // bca0
// or
echo $value = base_convert(intval($value, 36) + 1, 10, 36);
答案 1 :(得分:0)
如果你的字符串是单个案例而不是混合字符串,并且不包含数字,那么你可以逐字地增加它:
$testString="AA";
for($x = 0; $x < 65536; $x++) {
echo $testString++.'<br />';
}
$testString="aa";
for($x = 0; $x < 65536; $x++) {
echo $testString++.'<br />';
}
但即使使用混合的字母数字字符串
,您也可以使用此功能答案 2 :(得分:0)
为了扩展meagar的答案,以下是如何使用大写字母和数字任意大(需要bcmath extension,但你可以使用gmp或bigintegers pear包):< / p>
function base10ToBase62($number) {
static $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$result = "";
$n = $number;
do {
$remainder = bcmod($n, 62);
$n = bcdiv($n, 62);
$result = $chars[$remainder] . $result;
} while ($n > 0);
return $result;
}
for ($i = 10; $i < 99; ++$i) {
echo base10ToBase62((string) $i), "\n";
}
答案 3 :(得分:0)
这是incr
函数的一个实现,它接受包含字符[0-9a-zA-Z]的字符串并递增它,如果需要使用'carry-the-one'将0推到前面方法
<?php
function incr($num) {
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$parts = str_split((string)$num);
$carry = 1;
for ($i = count($parts) - 1; $i >= 0 && $carry; --$i) {
$value = strpos($chars, $parts[$i]) + 1;
if ($value >= strlen($chars)) {
$value = 0;
$carry = 1;
} else {
$carry = 0;
}
$parts[$i] = $chars[$value];
}
if ($carry)
array_unshift($parts, $chars[0]);
return implode($parts);
}
$num = '0';
for ($i = 0; $i < 1000; ++$i) {
echo $num = incr($num), "\n";
}