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);