$s = ['0', '1', '2', '3', '4', '5', '6', '8', '9', 'А', 'B', 'C', 'D']; // Можно продолжить массив, сколько надо.
$ok = true; // Флаг того, что строка уже присутствует в БД
for ( $len = 1; $ok; $len++ ) { // "Бесконечный" цикл, увеличиваем длину строки $len
$map = clearArray( $len ); // Карта перебора символов в массиве $s
while ( $ok && $map )
$str = makeStrByMap( $map );
$ok = searchStr( $str ); // Поиск строки в БД. Найдена — true, не найдена — false
$map = nextStep( $map ); // Следующий шаг карты. Если перебор карты исчерпан, то возвращает вместо массива false
}
function clearArray( $len ) {
// Создание нулевого массива длины $len
$arr = array();
for ( $i = 0; $i < $len; $i++ )
$arr[ $i ] = 0;
}
function makeStrByMap( $map ) {
// Формирование строки по карте $map
global $s;
$str = '';
for ( $i = 0; $i < sizeof( $map ); $i++ )
$str .= $s[ $map[ $i ] ];
return $str;
}
function nextStep( $map ) {
// Возвращает следующий шаг карты или false, если достигнут предел перебора
global $s;
$n = sizeof( $s );
for ( $i = 0; $i < $n; $i++ )
if ( $map[ $i ] == $n )
// Если в разряде $i достигнут предел, то зануляем его и переходим к инкременту старщего разряда
$map[ $i ] = 0;
else {
// Если предел не достигнут, просто +1 в текущем разряде
$map[ $i ]++;
break;
}
return ( $i == $n ) ? $map : false; // Если перебор закончен, возвращаем false, если нет — карту
}
function searchStr( $str ) {
...
}