Олег Г.
57 сообщений
#16 лет назад
Є дерево в базі данних де id кожного наступного прив*язуэться до попереднього
Як за допомогою рекурсії повернути масив всіх попередніх id незважаючи на те на якому рівні вложеності ми знаходимся.
Тут я прикинув деяку функцію(з рекурсією до цього часу не зустрічався), добився лише того що повертається лише 1 попередній id

function big_menu($page){
global $db;
$sql="SELECT root_id FROM tree_logic WHERE content_id='{$page}'";
$db->query($sql);
while ( $db->next_record()){
$rr=$db->f('root_id');
$root_id=$rr;
big_menu($rr);

}
return $root_id;
}
Александр К.
114 сообщений
#16 лет назад
Если я правильно вас понял, то тут вам правильнее всего было бы сделать глобальный массив, и в него каждый раз при входе в рекурсию, добавлять в этот массив ID вершины поддерева в котором мы сейчас находимся(Если правильно понял вас то $page). В итоге после того как отработает эта рекурсия в массиве в который вы накапливали ID's будут храниться все вершины выше той, с которой вы запускали, где первой в списке будет сама вершина. Если надо более подробно, то обратитесь - поможем.
Вадим Т.
3240 сообщений
#16 лет назад
Если content_id - уникальное поле, то для данной задачи не нужна рекурсия. Достаточно цикла:

$root_id = array();
while (1) {
$db->query("SELECT root_id FROM tree_logic WHERE content_id='{$page}'");
if (!$db->next_record() || !($page = $db->f('root_id'))) break;
$root_id = $page;
}

(подразумевается, что на вход поступает $page)
Гость
156 сообщений
#16 лет назад
Зачем глобальный массив, если можно передать массив по ссылке?

function big_menu($page,&$root_id){
global $db;
$sql="SELECT root_id FROM tree_logic WHERE content_id='{$page}'";
$db->query($sql);
while ( $db->next_record()){
$rr=$db->f('root_id');
$root_id=$rr;
big_menu($rr,&$root_id);

}
}
Вызов
$MyArray = array();
big_menu(1,&$MyArray);
Александр К.
114 сообщений
#16 лет назад
А вы можете объяснить чем тут глобальный массив хуже?
Олег Г.
57 сообщений
#16 лет назад
Помог глобальний масив .
Спасиба за помощ!