给出一个自定义字母,例如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
答案 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);
这个具有支持多字节字符的优点