Как увеличить буквенно-цифровую строку в PHP?

есть строка, содержащая символы [a-zA-Z0-9]. Это должно быть 26 * 2 + 10 = 62 возможности в одного персонажа и 62^2 в двух. Каков предпочтительный способ увеличения значения такой строки, так что " aA "становится" aB " и т. д.? Есть ли какие-либо встроенные вещи в PHP, которые могут помочь?

Я знаю, что вы можете увеличить строку, но это только строчные буквы. По сути, результат должен идти от " a " к " aa " с шагом 61.

6 ответов


@simshaun не работает для меня. Я проверяю документацию, и я нашел base_convert это может работать для вас (на базе 35) и комментарий"Франческо[at]paladinux.net " с функцией для работы на base65.

таким образом, решение может быть:

преобразовать в b10 - > инкремент +1 - > преобразовать base 65

правка 1

говоря о преобразовании, я думаю, в кодировку base64, поэтому я написал эти 2 функции, используя base64 кодирование / декодирование чисел. К сожалению, используемая кодировка немного больше: [a-zA-Z0-9/+=], но использование внутренней функции более эффективно.

Нулевой 0 - " AA=="

function nencode($in){
        $res ="";
        while(1){
                $b = $in & 0xff;
                $res = chr($b) . $res;

                if($in > 0xff){
                        $in = $in >> 8;
                } else {
                        break;
                }
        }
        return base64_encode($res);
}

function ndecode($in){

        $rv=0;
        $res =base64_decode($in);
        for($t = 0 ; $t < strlen($res) ; $t++){
                if($t>0){
                        $rv = $rv << 8;
                }
                $c = ord($res{$t});
                $rv |= $c;
        }
        return $rv;
}

это работает для меня:

<?php
$str = 'a';
echo ++$str; // b

$str = 'z';
echo ++$str; // aa

$str = 'aA';
echo ++$str; // aB

попробуйте эту функцию:

<?php
function increment(&$string){
    $last_char=substr($string,-1);
    $rest=substr($string, 0, -1);
    switch ($last_char) {
    case '':
        $next= 'a';
        break;
    case 'z':
        $next= 'A';
        break;
    case 'Z':
        $next= '0';
        break;
    case '9':
        increment($rest);
        $next= 'a';
        break;
    default:
        $next= ++$last_char;
    }
    $string=$rest.$next;
}

    //sample
    $string='a';
    for($i=1;$i<=128;$i++){
        echo $string."<br>";
        increment($string);
    }
    ?>

Мне нравится этот. Как использовать: ClassX:: increment ('p04E7K', 6); ClassX:: decrement ('p04E7K', 6);

код:

class ClassX {
    public static $baseCharacters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

    public static function increment($x, $digits)
    {
        $charList = static::$baseCharacters;

        // completa cadeia de caracteres com o numero de digitos parametrizados
        $x = trim($x);
        if(strlen($x) < $digits) {
            $x = str_pad($x, $digits, substr($charList, 0, 1), STR_PAD_LEFT);
        }

        $result = preg_split("//", $x, -1, PREG_SPLIT_NO_EMPTY);
        // percorre a cadeia de caracteres de tras pra frente e incrementa o primeiro caractere possivel
        for ($i = $digits - 1; $i >= 0; --$i)
        {
            $char = $result[$i];
            $currentChar = strpos($charList, $char);
            $nextCharPosition = $currentChar+1;

            if($nextCharPosition < strlen($charList)) {
                $nextChar = substr($charList, $nextCharPosition, 1);

                $result[$i] = $nextChar;
                break;
            }
        }

        return implode('', $result);
    }

    public static function decrement($x, $digits)
    {
        $charList = static::$baseCharacters;

        // completa cadeia de caracteres com o numero de digitos parametrizados
        if(strlen($x) < $digits) {
            $x = str_pad($x, $digits, substr($charList, 0, 1), STR_PAD_LEFT);
        }

        $result = preg_split("//", $x, -1, PREG_SPLIT_NO_EMPTY);
        // percorre a cadeia de caracteres de tras pra frente e decrementa o primeiro caractere possivel
        for ($i = $digits - 1; $i >= 0; --$i)
        {
            $char = $result[$i];
            $currentChar = strpos($charList, $char);
            $previousCharPosition = $currentChar-1;

            if($previousCharPosition > -1) {
                $previousChar = substr($charList, $previousCharPosition, 1);

                $result[$i] = $previousChar;

                // define os caracteres apos o decrementado para o ultimo caractere. ex: 3[00] > 2[99]
                for ($j = $i + 1; $j < $digits && $i < $digits - 1; ++$j)
                    $result[$j] = substr($charList, strlen($charList)-1, 1);
                break;
            }
        }

        return implode('', $result);
    }
}

Я думаю, что это принципиально делает то, что вам нужно.

<?php

$chars = 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',
    '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',
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9');

$increment1 = 0;
$increment2 = 0;

for ($i = 0; $i <= 200; $i++) {
    if ($increment2 === 62) {
        $increment1++;
        $increment2 = 1;
    } else {
        $increment2++;
    }
    echo "{$chars[$increment1]}{$chars[$increment2]} ";
}

/*
Output:
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 
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 
0 1 2 3 4 5 6 7 8 9 aa ab ac ad ae af ag ah ai aj ak al
am an ao ap aq ar as at au av aw ax ay az aA aB aC aD aE 
aF aG aH aI aJ aK aL aM aN aO aP aQ aR aS aT aU aV aW aX 
aY aZ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 ba bb bc bd be bf bg 
bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz 
bA bB bC bD bE bF bG bH bI bJ bK bL bM bN bO bP bQ bR bS 
bT bU bV bW bX bY bZ b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ca cb 
cc cd ce cf cg ch ci cj ck cl cm cn co
*/

Я пришел к этому вопросу, поскольку я искал также способ генерировать автоматический инкрементный буквенно-цифровой уникальный идентификатор, очень похожий на то, что у нас есть в мобильных деньгах(M-PESA) в Кении. Для справки, вот скриншот, показывающий транзакции скриншот, показывающий примеры транзакций MPESA Я хотел бы оставить его здесь, Если кто-то ищет аналогичные свойства: т. е. - Autoincrement буквенно-цифровой - Все символы в верхнем регистре - автоматическое увеличение длины строки один раз измученный. - приращение от 0 до 9, затем от A до Z до увеличения соседнего символа числа и является модификацией ответа @phobia82

function increment($string){
    $last_char=substr($string,-1);
    $rest=substr($string, 0, -1);
    switch ($last_char) {
        case '':
            $next= 'A';
            break;
        case 'Z':
            $next = '0';
            $unique = increment($rest);
            $rest = $unique;
            break;
        case '9':
            $next= 'A';
            break;
        default:
            $next = ++$last_char;
            break;
    }
    $string=$rest.$next;
    return $string;
}