代码之家  ›  专栏  ›  技术社区  ›  lejahmie

PHP页面结构到数组

  •  0
  • lejahmie  · 技术社区  · 15 年前

    好吧,这是我的问题。 我有一个页面结构保存到一个mysql数据库中。 这样地:

    第1页
    -第1.1页
    --第1.1.1小节
    --第1.1.1.1小节
    --第1.1.1.2小节
    --第1.1.2小节
    -第1.2页
    -第1.3页
    第2页
    第3页

    结构可以有无限的页面和子页面。所有页面都有一个名为“url”和“childof”的字段。childof”是将一个页面作为另一个页面的子页面绑定的内容。

    例子: 第1页有“url”第1页,“childof”为空
    子页1.1有“url”子页1-1和“childof”第1页
    子页1.1.1包含“url”子页1-1-1和“childof”子页1-1

    希望你有个基本的想法。

    我的问题是做一个循环,把所有这些页面放到一个好的数组中。

    获取第一行页面很容易;

    $sql = "SELECT * FROM `page` WHERE `childof` = ''
      ORDER BY `id` DESC";
    $result = mysql_query($sql);
    $i=0;
    while ($row = mysql_fetch_assoc($result)) {
     $pages[$i]['id'] = $row['id'];
     $i++;
    }
    

    第二行也很容易…

    for($x=0; $x < sizeof($pages); $x++){
     $sql = "SELECT * FROM `page` WHERE `childof` = '".$pages[$x]['url']."'
       ORDER BY `id` DESC";
     $result = mysql_query($sql);
     $i=0;
     while ($row = mysql_fetch_assoc($result)) {
      $pages[$x]['children'][$i]['id'] = $row['id'];
      $i++;
     }
    }
    

    当然,我可以这样继续下去。但是在不知道有多少子页的情况下这样做并不是很有效。那么,如何进行循环以将所有页和子页检索到具有良好结构的数组中呢?

    谢谢您!

    3 回复  |  直到 15 年前
        1
  •  1
  •   ontrack    15 年前

    第一个解决方案是使用递归来检索每个页面的子级。但是,当页面数量变大时,这可能会导致大量的查询,特别是如果页面嵌套得很深。

    你可能想看看 this blog-entry 使用单个查询检索所有页,然后使用映射访问特定页的子级。

        2
  •  0
  •   Tristan    15 年前

    你想用递归来解决这个问题,这是我最近为解决类似任务所做的一些示例代码。

    function retrieveFolderChildren($iRoot, &$aChildren, $cMysql)
        {
            if($cStatement = $cMysql->prepare("SELECT folderName, id FROM dir_structure WHERE rootId=? ORDER BY folderName"))
            {
                $cStatement->bind_param('i', $iRoot);
                $cStatement->execute();
    
                $cStatement->bind_result($sFolderName, $iId);
    
                while ($cStatement->fetch())
                {
                    $aChildren[] = array( "folderName" => $sFolderName, "id" => $iId, "children" => array());
                }
    
                $cStatement->close();
            }
    
            foreach ($aChildren as &$aChild)
            {
                retrieveFolderChildren($aChild["id"], $aChild["children"], $cMysql);
            }
        }
    
        3
  •  0
  •   Jordy    15 年前

    编辑表,将名为subcat的新字段设为int 1=真 0 =假

    创建ifstatement以查找值,如果是,则转到while循环,否则不执行任何操作?

    推荐文章