如何使用自定义字符集递增字符串

时间:2019-02-16 18:45:56

标签: php string numbers

给出一个自定义字母,例如shell

我想像这样用“字母”写一个字符串

['f', 'h', 'z', '@', 's']并递增

例如,如果字符串为ffff@zz,则在递增后,其外观类似于sss,与递增hfff时,得到999

我当前的尝试是在这里:https://3v4l.org/FjAsd

给出:

1000

我的代码可以做到:

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

但是如果给它

baaaa

它将返回 $characters = ['a', 'b', 'c']; $string = 'aaa';

我期望b

2 个答案:

答案 0 :(得分:1)

此方法的工作方式是从头开始处理字符串,每次查看字符时都要检查其在数组中的位置(我使用翻转数组,因为它比每次使用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@

答案 1 :(得分:0)

我最终得到了这样的东西:

$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);

这个具有支持多字节字符的优点