Создать неупорядоченное дерево списка меню из данных, хранящихся в таблице с моделью списка смежности - PullRequest
0 голосов
/ 25 марта 2010

Мне нужно создать древовидное меню из "n" подкатегорий. Я решил использовать модель списка смежности для своей структуры таблицы, потому что я не буду много обновлять эту таблицу, и это казалось самым простым в реализации для моего использования.

Я хочу стилизовать вывод, используя теги "ul" и "li" ... У меня уже есть решение css и jquery для стилизации. Моя проблема связана с извлечением данных из базы данных и использованием рекурсивной функции через PHP для построения списка ... список представляет собой сцепленную строку, которая анализируется для построения дерева. Мне действительно трудно заставить закрывающие теги "ul" и "li" выровнять то, где они должны быть.

Это лучший способ сделать это? Есть ли другие лучшие способы использовать массивы или что-то подобное для этого? Будем весьма благодарны за любые примеры, на которые вы можете указать мне «лучшие практики» для составления такого списка. Благодарю.

Вот моя структура таблицы:

portfolio_id (int), p_name (varchar), parent_portfolio_id (int) Вот как я хочу, чтобы данные выглядели при представлении:

<ul>
<li>Portfolio Name
    <ul>
        <li>Sub portfolio A
            <ul>
                <li>Sub portfolio A - 1</li>
                <li>Sub portfolio A - 2</li>
                <li>Sub portfolio A - 3</li>
            </ul>
        </li>
        <li>Sub portfolio B</li>
        <li>Sub portfolio C</li>
    </ul>
</li>
</ul>

Вот текущая рекурсивная функция:

function portf($ndb, $portfolio_id, $space=1, $x="", $level=1) // cat id, space to add "_" degree of categoreis times, list of categories
{
    $sql = "SELECT portfolio_id, p_name, parent_portfolio_id FROM portfolio WHERE parent_portfolio_id = $portfolio_id ORDER BY p_name ASC;";
    $select = $ndb->get_results($sql, 0, ARRAY_A);
    if( !is_null($select) )
    {
        foreach($select as $data)
        {
            $x = $x . $data->portfolio_id . '_' . $data->parent_portfolio_id . '_' . $level . str_repeat('_', $space) . $data->p_name . '-'; 
            $x = $this->portf($ndb, $data->portfolio_id, ($space+1), $x, ($level+1) );  
        }
        return $x; 
    }
    else
    {
        return $x;
    }
}

1 Ответ

1 голос
/ 25 марта 2010

Должен признать, вы потеряли меня из-за своего кода. Что случилось со всеми $ пробелами и str_repeat?

Во всяком случае, это то, что я бы попробовал.

function portf($ndb, $portfolio_id, $level=1)
{
    $sql = "SELECT portfolio_id, p_name, parent_portfolio_id FROM portfolio WHERE parent_portfolio_id = $portfolio_id ORDER BY p_name ASC;";
    $select = $ndb->get_results($sql, 0, ARRAY_A);

    if( !is_null($select) )
    {
        $li = "";
        foreach($select as $data)
        {
            $sublist = portf($ndb, $data->portfolio_id, $level+1);
            $li .= "<li>{$data->p_name}{$sublist}</li>";
        }
        $ul = "<ul class=\"level_$level\">$li</ul>";
        return $ul;
    }
    else
    {
        return "";
    }
}
...