Как с помощью рекурсии правильно придерживаться правила norepeat?

Ребят, в общем есть функция, которая написана при помощи говнокода.
Она выполняет следующую задачу:
Определяет реферера. То есть если у человека уже есть три(или другое число) реферала, то он пробегается по этим трем рефералам, и выбирает того, у кого меньше трех рефералов, если таких нет - спускается ниже.
Этот код работает исправно, но написан он слишком коряво. То есть если что-то нужно изменить, или добавить, то лопатить дай боже.
Вот я хочу исправить это. Но что-то застопорился с рекурсией. Как правильно тут сделать, чтобы можно было уровень добавить при помощи увелечения аргумента. В две функции, или она сама себя тут будет вызывать?
P.S. Я не за готовым решением пришел(я знаю что за ним дорога на фриланс), а за наводкой. Какой участок кода внести в отдельную функцию(если она здесь необходима). И как вообще правильнее и универсальнее это сделать. А то я немного закипел.
function overflow($parent_cook) {
	global $CONNECT;
	$parent_link = mysqli_fetch_assoc(mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `id` = $parent_cook"));
	$data_parent = mysqli_fetch_assoc(mysqli_query($CONNECT, "SELECT * FROM `users_data` WHERE `id_user` = $parent_cook"));

	if ( $data_parent['overflow'] > 0 ) {
		////// Если переливы включены, то выполняется определение реферала и сортировка.
		$referal_num = mysqli_num_rows(mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$parent_link[id]'"));

		if ( $referal_num >= $data_parent['width'] ) {
			// echo "Выполняется условие перелива<br>";
			// echo "Чекаем первую линию<br>";
			$curator = mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$parent_link[id]'");

			////////////////////////////////////
			///--- Чекаем первую линию
			////////////////////////////////////
			while ( $change_curator = mysqli_fetch_assoc($curator) ) {
				//// Показываем кураторов первого уровня
				$referal_num = mysqli_num_rows(mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$change_curator[id]'"));
				// echo "<b>".$change_curator['login']." - 1 уровень ".$referal_num."</b><br>";
					
				if ( $referal_num >= $data_parent['width'] ) {
					// echo "Двигаем дальше...<br>";				
				} else {
					// echo "Нашли куратора...<br>";
					return $change_curator['id'];
				}
			}

			////////////////////////////////////
			///--- Чекаем вторую линию
			////////////////////////////////////
			// echo "Чекаем вторую линию<br>";
			$curator = mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$parent_link[id]'");

			while ( $change_curator = mysqli_fetch_assoc($curator) ) {
				//// Показываем кураторов первого уровня
				$referal_num = mysqli_num_rows(mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$change_curator[id]'"));
				// echo "<b>".$change_curator['login']." - 1 уровень ".$referal_num."</b><br>";

				$curator_1 = mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$change_curator[id]'");

				while ( $change_curator_1 = mysqli_fetch_assoc($curator_1) ) {
		
					$referal_num_1 = mysqli_num_rows(mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$change_curator_1[id]'"));
					// echo "<b>--".$change_curator_1['login']." - 2 уровень ".$referal_num_1."</b><br>";
					
					if ( $referal_num_1 >= $data_parent['width'] ) {
						// echo "Двигаем дальше...<br>";				
					} else {
						// echo "Нашли куратора...<br>";
						return $change_curator_1['id'];
					}
				}
			}

			////////////////////////////////////
			///--- Чекаем третью линию
			////////////////////////////////////
			// echo "Чекаем третью линию<br>";
			$curator = mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$parent_link[id]'");

			while ( $change_curator = mysqli_fetch_assoc($curator) ) {
				//// Показываем кураторов первого уровня
				$referal_num = mysqli_num_rows(mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$change_curator[id]'"));
				// echo "<b>".$change_curator['login']." - 1 уровень ".$referal_num."</b><br>";

				$curator_1 = mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$change_curator[id]'");

				while ( $change_curator_1 = mysqli_fetch_assoc($curator_1) ) {
			
					$referal_num_1 = mysqli_num_rows(mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$change_curator_1[id]'"));
					
					// echo "<b>--".$change_curator_1['login']." - 2 уровень ".$referal_num_1."</b><br>";
					$curator_2 = mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$change_curator_1[id]'");

					while ( $change_curator_2 = mysqli_fetch_assoc($curator_2) ) {

						$referal_num_2 = mysqli_num_rows(mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$change_curator_2[id]'"));
						
							// echo "<b>----".$change_curator_2['login']." - 3 уровень ".$referal_num_2."</b><br>";
						if ( $referal_num_2 >= $data_parent['width'] ) {
							// echo "Двигаем дальше...<br>";
						} else {
							// echo "Нашли куратора...<br>";
							return $change_curator_2['id'];
						}
					}
				}
			}
			
		} else {
			return $parent_cook;
		}
	} else {
		return $parent_cook;
	}
}
  • Вопрос задан
  • 190 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Memorivardo
Тут надо посмотреть на важность уровня. Если Вы хотите пройти всё дерево рефералов, то нужна однозначно рекурсия, а если хотите именно задавать количество уровней, то нужен простой цикл.
Что в итоге нужно получить?

Голова с утра туго соображает, но если полный обход нужен, то будет что-то в духе:
function search($parent_link,$data_parent) {
	
	global $CONNECT;
	
	$curator = mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$parent_link[id]'");
	while ($change_curator = mysqli_fetch_assoc($curator) ) {

		$referal_num = mysqli_num_rows(mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$change_curator[id]'"));

		if ( $referal_num >= $data_parent['width'] )
			return search($change_curator);
		else 
			return $change_curator['id'];		
	}
}

function overflow($parent_cook) {
	global $CONNECT;
	$parent_link = mysqli_fetch_assoc(mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `id` = $parent_cook"));
	$data_parent = mysqli_fetch_assoc(mysqli_query($CONNECT, "SELECT * FROM `users_data` WHERE `id_user` = $parent_cook"));

	if ( $data_parent['overflow'] > 0 ) {
		////// Если переливы включены, то выполняется определение реферала и сортировка.
		$referal_num = mysqli_num_rows(mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `parent` = '$parent_link[id]'"));

		if ( $referal_num >= $data_parent['width'] ) 
			return search($parent_link,$data_parent);
		else 
			return $parent_cook;					
	} 
	else {
		return $parent_cook;
	}
}
Ответ написан
@DevOFF
На сколько я знаю. Такое количество запросов в бд не есть Хорошо.
Вижу так сделать массивы данных и работать с ними. минимизировать запросы к бд.
не совсем понятно .
Определяет реферера. То есть если у человека уже есть три(или другое число) реферала, то он пробегается по этим трем рефералам, и выбирает того, у кого меньше трех рефералов, если таких нет - спускается ниже.
допустим пришел запрос , user1 - c числом 3 ( реферал номер 3)
то он пробегается по этим трем рефералам
и выбирает того, у кого меньше трех рефералов - выберает того реферала у которого меньше 3 переходов.
$user = 'us/3';
$user_ref = 3;
$ref_arr = [ 
'1' => array('count'=>1),
'2' => array('count'=>3),
'3' => array('count'=>3)
];
foreach($ref_arr as $one){
      if($one['count']<3){
       //выбрали
       return breake; // до перевого совпадения
      }
}

Если я правильно понял условие
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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