Что вам действительно нужно сделать, так это конвертировать из базы 10 в базу strlen($characters)
.
PHP поставляется со встроенной функцией base_convert
, но он не выполняет то, что вам нужно, поскольку он будет использовать числа ноль, единицу и букву 'o', которых нет в вашей версии. Поэтому вам понадобится функция для сопоставления значений от base_convert
с / до ваших значений:
function map_basing($number, $from_characters, $to_characters) {
if ( strlen($from_characters) != strlen($to_characters)) {
// ERROR!
}
$mapped = '';
foreach( $ch in $number ) {
$pos = strpos($from_characters, $ch);
if ( $pos !== false ) {
$mapped .= $to_characters[$pos];
} else {
// ERROR!
}
}
return $mapped;
}
Теперь, когда у вас есть это:
public function next_id($last_id)
{
$my_characters = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
$std_characters ='0123456789abcdefghijklmnopqrstuv';
// Map from your basing to the standard basing.
$mapped = map_basing($last_id, $my_characters, $std_characters);
// Convert to base 10 integer and increment.
$intval = base_convert($mapped, strlen($my_characters), 10);
$intval++;
// Convert to standard basing, then to our custom basing.
$newval_std = base_convert($intval, 10, strlen($my_characters));
$newval = map_basing($newval_std, $std_characters, $my_characters);
return $newval;
}
Там могут быть некоторые синтаксические ошибки, но вы должны понять суть.