【问题标题】:Php recursive function optimizationphp递归函数优化
【发布时间】:2011-10-01 07:09:45
【问题描述】:

我的递归 php 函数看起来像这样。它根据父子结构从 db 表生成菜单

function generateMenu($parent, $level, $menu, $db){
  $q = $db->query("select id, name FROM menu WHERE parent = '$parent' AND showinmenu='$menu'");
  if($level > 0 && $q->num_rows > 0){
    echo "\n<ul>\n";
  }
while($row=$q->fetch_object()){
    echo "<li>";
    echo '<a href="?page=' . $row->id . '">' . $row->name . '</a>';
    //display this level's children
    generateMenu($row->id, $level++, $menu, $db);
    echo "</li>\n\n";
}
  if($level > 0 &&  $q->num_rows > 0){
    echo "</ul>\n";
  }
}

它有效,但我觉得它做一堆工作是徒劳的。有什么需要优化的地方吗?

【问题讨论】:

  • 与其多次调用函数generateMenu,不如用一组ids调用一次,然后执行一次查询。您只需重写查询以获取一个数组作为输入并从数据库中抓取该数组的所有记录
  • 我无法用数组计算出来。
  • @TT13:检查这个问题:stackoverflow.com/questions/4048151/… 了解在数据库中存储分层数据的其他一些方法。

标签: php mysql


【解决方案1】:

我会像这样去掉一些代码:

function generateMenu($parent, $level, $menu, $db){

$q = $db->query("select id, name FROM menu WHERE parent = '$parent' AND     showinmenu='$menu'");

  if($level > 0 && $q->num_rows > 0){
    echo "\n<ul>\n";

 while($row=$q->fetch_object()){
echo "<li>";
echo '<a href="?page=' . $row->id . '">' . $row->name . '</a>';
//display this level's children
generateMenu($row->id, $level++, $menu, $db);
echo "</li>\n\n";
}

echo "</ul>\n";
  }
}

【讨论】:

    【解决方案2】:

    我会节省许多数据库查询,而是像这样一次性完成。这肯定会带来更好的性能:

    function generateMenu($parent, $level, $menu, $db){
      $q = $db->query("select parent, id, name FROM menu WHERE showinmenu='$menu'");
      $elements = array();
      while($row=$q->fetch_object()){
        $elements[$row->parent][] = $row;
      }
      _generateMenu($parent, $level, $elements);
    }
    function _generateMenu($parent, $level, $elements){
      if (!array_key_exists($parent, $elements)){
        return;
      }
      if($level > 0){
        echo "\n<ul>\n";
      }
    
      foreach($elements[$parent] as $row){
          echo "<li>";
          echo '<a href="?page=' . $row->id . '">' . $row->name . '</a>';
          //display this level's children
          _generateMenu($row->id, $level+1, $elements);
          echo "</li>\n\n";
      }
    
      if($level > 0){
        echo "</ul>\n";
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-20
      • 2018-03-08
      • 2023-03-04
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2021-03-28
      相关资源
      最近更新 更多