PHP MySQL вертикальное меню - PullRequest
       5

PHP MySQL вертикальное меню

0 голосов
/ 12 февраля 2011

Я пытаюсь создать динамическое вертикальное меню: моя таблица:

primary // primary key 
pid  //parent id 0 if none
cid //the actual category id
comment //some comment

Дело в том, что я хочу создать функцию php, где после чтения значений из базы данных она должна выводить ее вУпорядоченный список HTML (как многоуровневый вложенный неупорядоченный список) Я знаю, что это было бы легко достичь с помощью функции рекурсии, проблема в том, что я просто не могу это сделать .. Я пробовал много раз, но безуспешно Основная проблемаприходит во вложении (где давать элементы списка и где начинать список)

Буду очень признателен, если кто-нибудь из вас сможет мне помочь ...

ну, мне удалосьнаписать некрасивый код: {здесь я использовал две таблицы, одну для родителя и одну для ребенка}

$query="SELECT * FROM parentCat";
$result=mysql_query($query);

echo "<ul id=\"suckertree1\">";

while($row=mysql_fetch_array($result))
{
    $name=$row['comment'];
    $pid=$row['catid'];
    echo "<li><a href=\"#\"> $name</a> ";
    $query="select * from childCat WHERE pid=$pid";
    $subresult=mysql_query($query);
    $af=mysql_num_rows($subresult);
    if($af>0)
    {
        echo "<ul>";

        while($subrow=mysql_fetch_array($subresult))
            {
                $name=$subrow['comment'];
                echo "<li><a href=\"#\"> $name</a> </li>";

            }
            echo "</ul>";
    }
    echo "</li>";
}
echo "</ul>";

он покажет только один подуровень ... что я должен сделать, чтобы он работал бесконечноуровень

Ответы [ 3 ]

2 голосов
/ 12 февраля 2011

Я считаю, что сценарий while лучше для вас

$query = mysql_query("SELECT * FROM menu ORDER BY primary ASC");
$parent=0;
$sub=0
echo "<ul>";//start list
while($menu = mysql_fetch_array($query){
   if($parent != $menu['pid']){//if not seen item before
      if($sub != 0){echo "</ul>";}else{$sub++;}//if not first submenu, close submenu before. If first sub sub++.
      echo "<ul>";}//open submenu
   echo "<li>".$menu[cid]."</li>";//echo item
   if($parent != $menu['pid']){//if not seen before
      $parent = $menu['pid']; //set to seen before so next loop will be recognised
   }
}
echo "</ul>"; //end list

Я не знаю, сработает ли это, поскольку я не тестировал его, но он должен показать вам, как это можно сделать. Идея списков:

<ul>
  <li>Item1</li>
   <ul>
    <li>Subitem1</li>
    <li>Subitem2</li>
   </ul>
  <li>Item 2</li>
   <ul>
    <li>Subitem1 of Item2</li>
   </ul>
</ul>

Дает:

  • Элемент1
  • Subitem1
  • Subitem2
Элемент2
  • Подпункт1 пункта 2
0 голосов
/ 12 февраля 2011

Чтобы отобразить вложенный список для связанного массива, попробуйте следующее:

<?php
$list = array(
    'item-1' => 'test-1',
    'item-2' => 'test-2',
    'item-3' => array(
        'item-3-1' => 'test-3',
        'item-3-2' => array(
            'item-3-2-1' => 'test-4',
            'item-3-2-2' => 'test-5',
        ),
    ),
    'item-4' => 'test-6',
);

function render_list($list) {
    echo '<ul>';
    foreach ($list as $key => $value) {
        echo '<li>';
        echo $key.':';
        if (is_array($value)) render_list($value);
        else echo $value;
        echo '</li>';
    }
    echo '</ul>';
}

render_list($list);

Что приведет к этому:

<ul>
    <li>item-1:test-1</li>
    <li>item-2:test-2</li>
    <li>
        item-3:
        <ul>
            <li>item-3-1:test-3</li>
            <li>
                item-3-2:
                <ul>
                    <li>item-3-2-1:test-4</li>
                    <li>item-3-2-2:test-5</li>
                </ul>
            </li>
        </ul>
    </li>
    <li>item-4:test-6</li>
</ul>
  • item-1: test-1
  • item-2: test-2
  • item-3:
    • item-3-1: test-3
    • item-3-2:
      • элемент-3-2-1: тест-4
      • элемент-3-2-2: тест-5
  • пункт-4: тест-6
0 голосов
/ 12 февраля 2011

Попробуйте, это должно сработать.

<?php

$query = "SELECT a.comment parent
               , b.comment child
          FROM menu a
          JOIN menu b
          ON a.primary = b.pid
          ORDER BY a.primary";

$result = mysql_query($query);
$parent = ''; 
echo "<ul>";
foreach ($result as $next) {
   if ($next['parent'] != $parent) {
      if (strlen($parent) > 0) {
         echo "    </ul>";
         echo "  </li>";
      }   
      echo "  <li>" . $next['parent'];
      echo "    <ul>";
   }   
   echo "    <li>" . $next['child'] . "</li>";

   $parent = $next['parent'];
}
echo "    </ul>";
echo "  </li>";
echo "</ul>";

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...