@freshik312

Как реализовать цикл с возвратом?

Здравствуйте !
Нужно сделать цикл:
что бы случайным образом создавало строку из 1 символа (верхнего, нижнего регистра или цифра случайно),
потом поиск в базе такой же строки, если все возможные варианты использованы - начать такой же цикл, но строка из 2ух символов
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
@choupa
Архитектор (обычный, который строит)
$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 )	{
	...
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы