【问题标题】:Generate incremental id of numbers, Upper and Lower letters生成数字、大写字母和小写字母的增量id
【发布时间】:2014-12-16 14:19:34
【问题描述】:

如何在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,左侧的字符加一。例如:

0000
0001
0002
...
0009
000a
000b
...
000y
000z
000A
000B
...
000X
000Z
0010
0011
0012
....
0019
001a

【问题讨论】:

标签: php


【解决方案1】:

这应该适合你:

<?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";

?>

【讨论】:

  • @Rizier123 你也可以用range() 来表示数字,用foreach 代替,统一代码。
  • 我试过了,但我希望字符串中的每个字符都在这个范围内变化
  • 您还可以将三个不同的范围数组追加到一个大数组中以加快迭代速度。
  • @GiancarloVenturaGranados 您的产品系列没有明确的标准。
  • 我想从 0 到 9,然后是 a 到 z,然后是 A 到 Z。结束时,char 到 0,左边的 char 递增 1
【解决方案2】:

使用 0,1-9、a-z 和 A-Z 是“Base 62”。在 PHP 中从 base 10 转换为 base 62 非常简单。

<?php
echo base_convert(10123, 10,26), "\n";
// outputs: 'ep9'
echo base_convert('ep9', 26, 10), "\n";
// output 10123

【讨论】:

  • 其实base62base26很不一样
【解决方案3】:

base_convert只支持base2到base36的转换。

如果内涵只是在 base62 (0-9 a-z A-Z) 中递增,那么只需简单的算术递增(CPU 的方式)就足够了。

我们将 LSB(最低有效位/数字)加一,然后如果溢出,则增加下一个 LSB,直到达到 MSB(最高有效位/数字)。如果仍有溢出,则在前面加 1(不是零)。

注意:前导零在算术中没有意义,因此000aa 相同。如果您需要零填充,请稍后添加。

注意: Base62 中的数字顺序是 0-9,A-Z 然后 a-z(与 ASCII 表相同)。如果您想将其更改为 0-9a-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>";

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多