[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Генерация таблицы на основе многоуровнего массива
true
Приветствую, друзья!
Столкнулся с проблемой, уже часа 4 рушу себе мозг исписывая кодом класс одного маленького сайта, думается, эта проблема реализуется безумно просто, но допереть не могу))

Задача в том, что есть лошади. И у них есть мамы с папами. А у этих мам с папами тоже есть мамы с папами и т.п. biggrin.gif. Все это честно храница в бд типа:
id(bigint) - айди лошади
mom_id(bigint) - айди лошади-мамы
dad_id(bigint) - айди лошади-папы

Во время генерации страницы мы получаем id лошади. Лезем в бд. Получаем id мамы и папы. Все просто:

$data[mom]=mom_id;
$data[dad]=dad_id;

великолепно. Но когда требуется учесть еще бабушек, дедушек, прабабушек и всю наследственную линию, мозги начинают медленно кипеть, взбухать и медленно готовяться устроить ядерный взрыв.

Пробовал по разному,
от while до даже генерации текстовой строки "$data[1][2][3] и т.п. которая возвращала массив функцией eval().

Помогите плс) а я помогу чемнить другим чем знаю)

P.S. для наглядности вот ссыль: http://shevardino.ru/anketa.php?id=268



Спустя 52 минуты, 50 секунд (11.01.2010 - 00:38) dr_Lev написал(а):
Если глубина выборки уже известна, т.е. известно точно, что бабушки/дедушки - последние... то я бы выборку впихнул в SQL запрос, такого плана :

SELECT * FROM `koni`
WHERE `id` IN (
SELECT `mama_id`, `papa_id` FROM `koni`
WHERE `id` IN (
SELECT `mama_id`, `papa_id` FROM `koni`
WHERE `id`='$loshadka')
OR `id`='$loshadka')
OR `id`='$loshadka;


Суть такова: в самом внутреннем выбирается id мам и пап нужной конячки, в следующем выбираются id бабушек, дедушек, и опять же мам и пап, ну и в последнем (в верхнем) запросе выбираются все данный по найденный id, а также нужной лошадки... остается только разобраться кто есть кто :

сейчас додумаю

Спустя 24 минуты, 58 секунд (11.01.2010 - 01:03) Dezigo написал(а):
тебе нужна рекурсия. берёшь папу - ищещь родствеников(нашёл деда) - больше не ково нет. (выходишь на верх). и продолжаешь уже с мамой. и тд. идею написал.

Спустя 2 часа, 6 минут, 56 секунд (11.01.2010 - 03:10) inpost написал(а):
я бы на твоём месте все поместил бы в одну таблицу:
id_лошадь
id_dad
id_granddad
id_mother
id_grandmother


а вторая таблица список всех лошадей.

Спустя 54 минуты, 16 секунд (11.01.2010 - 04:04) dr_Lev написал(а):
В продолжение моего предыдущего поста :

// $loshadka - искомая конячка
$koni = array();
// Собираем в ассив всех коней
while ($row = mysql_fetch_assoc($query)){
$koni[$row['id']] = $row;
}

function koniTable($id, $koni){
$str = '<table><tr><td rowspan="2">';
if (isset($koni[$id])){
$str.= $koni['name'];
$str.= '</td>';
$str.= '<td>'.koniTable($koni['papa_id'],$koni).'</td></tr>';
$str.= '<tr><td>'.koniTable($koni['mama_id'],$koni).'</td></tr>';

else{
$str.= '---</td></tr>';
}
$str.= '</table>';
return $str;
}

if (isset($koni[$loshadka])){
$output = koniTable($loshadka, $koni);
}else{
$output = 'Лошадки в базе нет';
}

echo $output;

Код не проверял, но результат должен быть такого плана:

<table>
<tr>
<td
rowspan="2">
Жеребец
</td>
<td>
<table>
<tr>
<td
rowspan="2">
Папа жеребца
</td>
<td>
<table>
<tr>
<td
rowspan="2">
Папа папы жеребца
</td>
<td>
</td>
</tr>
<tr>
<td>

---
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<table>
<tr>
<td
rowspan="2">
Мама папы жеребца
</td>
<td>
</td>
</tr>
<tr>
<td>

---
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<table>
<tr>
<td
rowspan="2">
Мама жеребца
</td>
<td>
<table>
<tr>
<td
rowspan="2">
Папа мамы жеребца
</td>
<td>
</td>
</tr>
<tr>
<td>

---
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<table>
<tr>
<td
rowspan="2">
Мама мамы жеребца
</td>
<td>
</td>
</tr>
<tr>
<td>

---
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>



P.S. Поправлюсь насчет первого поста... можно даже и не знать сколько уровней делать, просто сделать генерацию SQL запроса в цикле:

$sql = "SELECT * FROM `koni`
WHERE `id` IN (%BEGIN%
SELECT `mama_id`, `papa_id` FROM `koni`
WHERE `id`='
$loshadka')
%END%)
OR `id`='
$loshadka;'";

//Цикл, тут $lvl - "уровень" родственников, т.е. мамы/папа - 1; прабабы/прадеды - 3... и т.д.
for ($i=0; $i<$lvl-1; $i++){
$begin = "SELECT `mama_id`, `papa_id` FROM `koni` WHERE `id` IN ( %BEGIN%";
$end = "%END%) OR `id`='$loshadka'";
$sql = str_replace(array('%BEGIN%','%END%'),array($begin,$end),$sql);
}
$sql = str_replace(array('%BEGIN%','%END%'),'',$sql);

$query = mysql_query($sql);

И опять же, я не проверял... могут быть небольшие (надеюсь) ошибки...

Спустя 10 дней, 5 часов, 42 минуты, 31 секунда (21.01.2010 - 09:46) true написал(а):
inpost я не могу знать сколько родственников может быть у данной лошади, поэтому сразу отбросил такой вариант.

dr_Lev Огромное спасибо) После работы с ActionScript отвык вызывать функцию саму в себе, а все было так просто))
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.