PHP и рекурсия, need help

СтаниславZ
На сайте с 17.09.2008
Offline
105
505

Всем привет,

уже несколько дней бьюсь с задачкой: нужно составить select с деревом пользователей. При этом, нужно учитывать реферральные отношения пользователей.

Пользователи берутся из бд. Сама таблица с польpователями пусть булет с такими полями: user_id, username, referer_id.

Нужно получить селект вида:


username1
username2
-username4
--username5
---username6
--username7
username3
-username8
-username9

код самого селекта:

<select>

<option value="1">username1</option>
<option value="2">username2</option>
<option value="4">-username4</option>
<option value="5">--username5</option>
<option value="6">---username6</option>
<option value="7">--username7</option>
<option value="3">username3</option>
<option value="8">-username8</option>
<option value="9">-username9</option>
</select>

Как видно из примера - значения селекта - это поле username и вложенность (задается символами "-"), ключ - это user_id из бд.

Копчиком чувствую, что нужна рекурсия. И как собака: понимать - понимаю, а написать - не могу.

Быть может, кто из из профи пнет в нужном направлении? А то я совсем потерялся.

GoRSS
На сайте с 29.07.2013
Offline
138
#1

$res=mysql_query("SELECT * FROM users WHERE referer_id=''"); //выбираем всех пользователей, у которых пустой реф_айди

while ($row=mysql_fetch_assoc($res)) {

echo '<option value="'.$row[id].'">$row[username]</option>';

$res2=mysql_query("SELECT * FROM users WHERE referer_id='$row[id]'"); // все рефы этого пользователя

while ($row2=mysql_fetch_assoc($res2)) {

echo '<option value="'.$row2[id].'">--$row2[username]</option>';

// и здесь еще несколько раз вложить цикл для рефов рефов

}

}

https://commersoft.ru - софт: Google Indexing [индексация в Гугле по API] - Webcontrol [мониторинг сайтов и доменов]
LEOnidUKG
На сайте с 25.11.2006
Offline
1724
#2

Есть такая красивая функция:

function build_hierarchy($arr, $id_key = 'id', $pid_key = 'parent_id') {

$structure = array();

while($elem = array_shift($arr)) {

if(isset($structure[ $elem[$id_key] ])) {

$elem['children'] = $structure[ $elem[$id_key] ];

unset($structure[ $elem[$id_key] ]);

} else

$elem['children'] = array();

if(isset($references[ $elem[$pid_key] ])) {

$references[ $elem[$pid_key] ]['children'][ $elem[$id_key] ] = $elem;

$references[ $elem[$id_key] ] =& $references[ $elem[$pid_key] ]['children'][ $elem[$id_key] ];

} else {

$structure[ $elem[$pid_key] ][ $elem[$id_key] ] = $elem;

$references[ $elem[$id_key] ] =& $structure[ $elem[$pid_key] ][ $elem[$id_key] ];

}

asort( $references );

}

return array($structure);

}

Делаете:

$resultget = mysql_query("SELECT * FROM `users`");

while ($myrow = mysql_fetch_array($resultget)){$bigmass[]=$myrow;}

$bigmass=build_hierarchy($bigmass,'user_id','referer_id');

теперь смотрите:

print_r($bigmass);

Увидите структуры.

А потом делаете рекурсию:

function view($bigmass)

{

echo /// оформляете как вам надо

getComments($row['children']);

}

view($bigmass[0][0]);

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
СтаниславZ
На сайте с 17.09.2008
Offline
105
#3

GoRSS, Спасибо за вариант. Забыл сказать, что именно этот вариант был и остается пока единственным реализованным работающим. Проблема в том, что когда 2-3 уровня вложенности - это еще куда ни шло. Но по заданию может быть и 10 и 20 уровней. А это уже не по фэн-шую :)

LEOnidUKG, Спасибо, сейчас попробую Ваш вариант.

---------- Добавлено 20.12.2014 в 18:17 ----------

LEOnidUKG, я не знаю как, но ваша функция действительно работает)

Спасибо большое, очень выручили!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий