- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Маркетинг для шоколадной фабрики. На 34% выше средний чек
Через устранение узких мест
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Всем привет,
уже несколько дней бьюсь с задачкой: нужно составить select с деревом пользователей. При этом, нужно учитывать реферральные отношения пользователей.
Пользователи берутся из бд. Сама таблица с польpователями пусть булет с такими полями: user_id, username, referer_id.
Нужно получить селект вида:
код самого селекта:
Как видно из примера - значения селекта - это поле username и вложенность (задается символами "-"), ключ - это user_id из бд.
Копчиком чувствую, что нужна рекурсия. И как собака: понимать - понимаю, а написать - не могу.
Быть может, кто из из профи пнет в нужном направлении? А то я совсем потерялся.
$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>';
// и здесь еще несколько раз вложить цикл для рефов рефов
}
}
Есть такая красивая функция:
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]);
GoRSS, Спасибо за вариант. Забыл сказать, что именно этот вариант был и остается пока единственным реализованным работающим. Проблема в том, что когда 2-3 уровня вложенности - это еще куда ни шло. Но по заданию может быть и 10 и 20 уровней. А это уже не по фэн-шую :)
LEOnidUKG, Спасибо, сейчас попробую Ваш вариант.
---------- Добавлено 20.12.2014 в 18:17 ----------
LEOnidUKG, я не знаю как, но ваша функция действительно работает)
Спасибо большое, очень выручили!