Как увеличить строку с помощью пользовательского набора символов - PullRequest
0 голосов
/ 16 февраля 2019

Учитывая пользовательский алфавит, такой как ['f', 'h', 'z', '@', 's']

Я хотел бы взять строку, написанную в этом "алфавите", как

ffff@zz, и увеличить ее

Так, например, если строка была sss После увеличения она будет выглядеть как hfff так же, как если вы увеличиваете 999, вы получите 1000

Моя текущая попытка здесь: https://3v4l.org/FjAsd

Дано:

$characters = ['a', 'b', 'c'];
$string = 'cccc';

мой код может сделать:

baaaa

, но если дать его

$characters = ['a', 'b', 'c'];
$string = 'aaa';

, он вернет b

Когда я ожидал aab

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

У меня получилось что-то вроде этого:

$string = 'ccc';
$alphabet = ['a', 'b', 'c'];

$numbers = array_keys($alphabet);
$numeric = str_replace($alphabet, $numbers, $string);
$base = count($alphabet) + 1;
$decimal = base_convert($numeric, $base, 10);
$string = base_convert(++$decimal, 10, $base);
strlen($decimal) !== strlen($string)
   and $string = str_replace('0', '1', $string);
echo str_replace($numbers, $alphabet, $string);

Преимущество этого метода в поддержке многобайтовых символов

0 голосов
/ 16 февраля 2019

Это работает путем обработки строки с конца, каждый раз, когда вы смотрите на символ, вы проверяете его положение в массиве (я использую перевернутый массив, так как он более эффективен, чем использование array_search() каждый раз).Затем, если символ находится в конце массива, установите для него 0-й элемент алфавита и увеличьте следующую цифру влево.Если в алфавите есть еще одна буква для увеличения текущего значения, просто замените ее и остановите цикл.

Последний бит состоит в том, что если вы обработали каждый символ и цикл все еще продолжался, то естьперенос - поэтому добавьте 0-ю цифру к началу.

$characters = ['a', 'b', 'c'];
$string = 'cccc';

$index = array_flip($characters);
$alphabetCount = count($index)-1;
for ( $i = strlen($string)-1; $i >= 0; $i--)  {
    $current = $index[$string[$i]]+1;
    // Carry
    if ( $current > $alphabetCount )  {
        $string[$i] = $characters[0];
    }
    else    {
        // update and exit
        $string[$i] = $characters[$current];
        break;
    }
}
// As reached end of loop - carry
if ( $i == -1 ) {
    $string = $characters[0].$string;
}
echo $string;

дает

aaaaa

с

$characters = ['f', 'h', 'z', '@', 's'];
$string = 'ffff@zz';

, вы получаете

ffff@z@
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...