Как получить родительский идентификатор (корневой родитель) из дочернего идентификатора

Возможный дубликат:
функция возвращается только один раз, почему?

моя структура базы данных выглядит так

id|parent|
1 |   0  |
2 |   0  |
3 |   0  |
4 |   1  |
5 |   4  |
6 |   5  |

Мне нужна функция, которая получает родителя (т.е. родитель = 0) для идентификатора в качестве параметра. Например.. get_parent (6) == возвращает 1. Я провел некоторое исследование и нашел этот вопрос

Как я могу рекурсивно получить родительский идентификатор строк в этой таблице MySQL?

Я пытался сделать эту функцию

    function get_parent_id($cid,$found=array())
    {
     array_push($found,$cid);
     $sql="SELECT * FROM tbl_destinations WHERE id=$cid";
     $result = mysql_query($sql) or die ($sql);
     if(mysql_num_rows($result))
     {

        while($row = mysql_fetch_assoc($result))
        {
        $found[] = get_parent_id($row['parent'], $found);
        }
     }
return $found;
       }

я звоню по

$fnd=get_parent_id();
$array_reverse($fnd);
$parent_root=$fnd['0'];

Но мой метод неверен. Где я ошибся?


person Bikal Basnet    schedule 12.11.2012    source источник
comment
Вам действительно не следует дублировать сообщения. Вы должны убедиться, что получили ответ на исходный вопрос.   -  person Jason McCreary    schedule 12.11.2012
comment
Несмотря на то . Я был бы очень рад, если бы кто-нибудь мог дать мне ответ, кроме того, что рассказал мне правила и положения. Извините за грубость..Мне очень нужен ответ на этот вопрос   -  person Bikal Basnet    schedule 12.11.2012
comment
пожалуйста, попытайтесь понять de.slideshare.net/billkarwin/models-for-hierarchical- данные   -  person Varon    schedule 12.11.2012
comment
вы не хотите, чтобы это был прямой родитель... вы хотите пройти весь путь вверх по дереву, пока он не станет корневым узлом, правильно? просто выполните рекурсивный цикл, получая каждого родителя, пока родитель = 0.   -  person MikeMurko    schedule 12.11.2012


Ответы (1)


Вы пытаетесь получить родительский идентификатор в SQL-запросе или используете PHP? Если вы хотите использовать для этого PHP, вы можете либо сделать $arr[6]['parent'], предполагая, что вы получили информацию из базы данных в массив. Или у вас может быть функция:

<?php
//Let's assume you have your data from the database as such
$arr = array(
    array('id' => 1, 'parent' => 0),
    array('id' => 2, 'parent' => 0),
    array('id' => 3, 'parent' => 0),
    array('id' => 4, 'parent' => 1),
    array('id' => 5, 'parent' => 4),
    array('id' => 6, 'parent' => 5));

function get_key($arr, $id)
{
    foreach ($arr as $key => $val) {
        if ($val['id'] === $id) {
            return $key;
        }
    }
    return null;
}

function get_parent($arr, $id)
{
    $key = get_key($arr, $id);
    if ($arr[$key]['parent'] == 0)
    {
        return $id;
    }
    else 
    {
        return get_parent($arr, $arr[$key]['parent']);
    }
}

echo get_parent($arr, 6);
?>

Обратите внимание, что код не тестировался и является всего лишь образцом.

person jmgardn2    schedule 12.11.2012
comment
ему нужен корневой родитель. так что не прямой родитель. вам нужно повторять, пока вы не получите $arr[$id]['parent'] = 0, а затем вернуть $id; - person MikeMurko; 12.11.2012
comment
да, я хочу корневого родителя. и @mikeMurko я пытаюсь это сделать. Если я это сделаю, я положу свои ответы здесь. Я почти очень близок к получению ответа. но меня смущает древовидная иерархия - person Bikal Basnet; 12.11.2012
comment
О, хорошо, тогда это имеет смысл, я обновил свой ответ, чтобы продемонстрировать, что вы ищете. Я протестировал и убедился, что он работает так, как ожидалось. - person jmgardn2; 12.11.2012
comment
Большое спасибо @jmgran2. Вы спасли мой день... - person Bikal Basnet; 13.11.2012
comment
Не проблема, рад, что смог помочь. Дайте мне знать, если вам нужно какое-либо объяснение кода, поскольку я не комментировал его. - person jmgardn2; 13.11.2012