【问题标题】:PHP MySQL Multidimensional Array - Dropdown MenuPHP MySQL 多维数组 - 下拉菜单
【发布时间】:2014-01-23 11:05:49
【问题描述】:

我想从 mysql 查询创建我的下拉菜单,但我遇到了子项目的问题。

我的基本表:

NavigationID  ParentID  Name       Url
1             1         Home       home
2             2         About      about
3             3         Products   products
4             3         Category1  #
5             3         Category2  #
6             4         Product1   #
7             5         Product2   #

我的简单 MySQL 查询并添加到数组:

class Navigation{
    private $data;

    public function __construct($par){
        if(is_array($par))
            $this->data = $par;
    }

    public function __toString(){
        return '<li><a href="'.$this->data['Url'].'">'.$this->data['Name'].'</a></li>';
    }
}

$query = mysql_query("SELECT * FROM Navigation n") or die(mysql_error());
$num = mysql_num_rows($query);
$menuitems = array();

while($row = mysql_fetch_assoc($query)){
    $menuitems[] = new Navigation($row);
}

echo '<div id="nav"><ul>';
foreach($menuitems as $item){
    echo $item;
}
echo '</ul></div>';

这样的结果是:

<div id="nav"><ul>
   <li><a href="home">Home</a></li>
   <li><a href="about">About</a></li>
   <li><a href="products">Products</a></li>
   <li><a href="#">Category1</a></li>
   <li><a href="#">Category2</a></li>
   <li><a href="#">Product1</a></li>
   <li><a href="#">Product2</a></li>
</ul></div>

但我真正喜欢的是:

<div id="nav"><ul>
   <li><a href="home">Home</a></li>
   <li><a href="about">About</a></li>
   <li><a href="products">Products</a>
       <ul>
          <li><a href="#">Category1</a>
              <ul>
                 <li><a href="#">Product1</a></li>
              </ul>
          </li>
          <li><a href="#">Category2</a>
              <ul>
                 <li><a href="#">Product2</a></li>
              </ul>
          </li>
        </ul>
   </li>
</ul></div>

我怎样才能达到这个结果?我尝试了许多其他示例,但似乎没有一个对我有帮助。也许我没有在寻找正确的东西。

【问题讨论】:

  • 先做2个循环你的父索引循环,然后在第一个循环下做另一个循环,这是父子循环,然后你就可以实现你的响应
  • 阿哈,你能给我举个例子吗?
  • smartcoderszone.com/2013/09/… 看看这个链接它会很好地帮助你它是递归函数
  • 太棒了!搞定了。谢谢阿迦!

标签: php mysql arrays multidimensional-array


【解决方案1】:

为什么要复杂,这可以通过一个非常简单的递归函数来完成。

这是我在本地机器上所做的。我有连接参数,然后调用了一个函数

bulit_tree(0);
  • 在此函数中,它将检查参数是否为 0,然后全选 id 和 parentid 相同的项目。
  • 然后循环使用递归函数生成子树。
  • 需要确保 $con 在函数中是可访问的。

    $con = mysql_connect("localhost","testuser","testpass");
    
    $db_selected = mysql_select_db('testdb', $con);
    if (!$db_selected) {
        die ('Can\'t use testdb : ' . mysql_error());
    }
    
    bulit_tree(0);
    
    function bulit_tree($pid=0){ 
        global $con ;   
        if($pid == 0 ){
                $qry = "select * from Navigation where NavigationID = ParentID";
                $q = mysql_query($qry,$con);
                if(mysql_num_rows($q) > 0 ){ 
                    echo '<ul>';
                    while($row = mysql_fetch_assoc($q)){
                        echo '<li><a href="'.$row["Url"].'">'.$row["Name"].'</a>';
                        bulit_tree($row["NavigationID"]);
                        echo '</li>';
                    }
                    echo '</ul>';
                }
        }else{
            $qry = "select * from Navigation where ParentID = ".$pid." AND NavigationID <> ".$pid;
            $q = mysql_query($qry,$con);
                if(mysql_num_rows($q) > 0 ){
                    echo '<ul>';
                    while($row = mysql_fetch_assoc($q)){
                        echo '<li><a href="'.$row["Url"].'">'.$row["Name"].'</a>';
                        bulit_tree($row["NavigationID"]);
                        echo '</li>';
                    }
                    echo '</ul>';
                }
        }
    }
    

【讨论】:

    【解决方案2】:

    您可能需要先重组数据库。考虑一个连接表。这很方便,特别是如果您的产品属于多个类别。

    主表:

        NavigationID    Name       Url
        1               Home       home
        2               About      about
        3               Products   products
        4               Category1  #
        5               Category2  #
        6               Product1   #
        7               Product2   #
    

    查找表:

        NavigationID    ParentId
        1               1
        2               2 
        3               3
        4               3
        5               3
        6               4
        7               5
    

    然后在您的班级中,您可以将其结构化为:

    <?php 
    class Navigation{
        private $menuitems;
    
        public function __construct($par){
            if(is_array($par))
                $this->menuitems = $par;
        }
    
        public function __toString() {
            $this->printNavigation($this->menuitems);
        }
    
         private function printMenuItem($menu) {
            echo '<li><a href="'.$menu->url.'">'.$menu->name.'</a>';
    
            if(count($menu->children)) {
                print printNavigation($menu->children);
            } 
            '</li>';
         }
    
        private function printNavigation($menuItems) {
            echo "<ul>";
            foreach ($menuitems as $menu {
                $this->printMenuItem($menu);
            }
            echo "</ul>";
        }
    }
    
    
    class MenuItem{
    
        private $url;
        private $name;
        private $children; 
    
        public function __construct($par){
            if(is_array($par)) {
                $this->url = $par['url'];
                $this->$name = $par['name'];
                $this->children = $this->fetchChildren($par['NavigationID']);
            }
    
        }
    
        function fetchChildren($id) {
            $query = mysql_query("SELECT * from navigation n INNER JOIN Lookup l on l.parentID = n.NavigationID 
                                    WHERE n.NavigationID = $id") or die(mysql_error());
            $num = mysql_num_rows($query);
            if($num > 0) {
    
                while($row = mysql_fetch_assoc($query)){
    
                    $this->children[] = new MenuItem($row);
                }
            }
        }
    
    }
    
    $query = mysql_query("SELECT * from navigation n INNER JOIN Lookup l on l.NavigationID = n.NavigationID 
                                WHERE l.NavigationID = l.parentIDn
                                AND l.NavigationID != n.NavigationID") or die(mysql_error());
    $num = mysql_num_rows($query);
    $menuitems = array();
    
    while($row = mysql_fetch_assoc($query)){
    
        $menuitems[] = new MenuItem($row);
    }
    
    $navigation = new Navigation($menuitems);
    
    echo "<div id='nav'>$navigation</div>";
    

    【讨论】:

    • 谢谢。这就是我原来的表格的工作方式,但为了这个问题,我想对其进行简化。
    • 很抱歉答案漏掉了代码部分。现在添加它。你基本上是递归调用菜单打印
    【解决方案3】:

    感谢所有 cmets。我同意 Agha 使用递归函数的建议。

    http://crisp.tweakblogs.net/blog/317/formatting-a-multi-level-menu-using-only-one-query.html

    【讨论】:

      猜你喜欢
      • 2019-05-20
      • 2012-01-20
      • 2012-01-12
      • 2014-08-03
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多