Это работает путем обработки строки с конца, каждый раз, когда вы смотрите на символ, вы проверяете его положение в массиве (я использую перевернутый массив, так как он более эффективен, чем использование 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@