好了,这就是我的问题。我有一个页面结构保存到mysql数据库中。如下所示:
第1页
第2页
第3页
该结构可以有无限的页面和子页面。所有页面都有一个名为"url“和"childof”的字段。“childof of”是将一个页面绑定为另一个页面的子页面。
示例:第1页包含"url“page-1,而"childof”为空
SubPage 1.1包含"url“子页面-1-1和”子页面“-1
SubPage 1.1.1具有"url“子页面-1-1-1和”子页面“-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++;
}
}当然,我也可以这样继续下去。但是,在不知道有多少子页面的情况下这样做效率不是很高。那么,如何创建一个循环来将所有页面和子页面检索到一个具有良好结构的数组中呢?
谢谢!
发布于 2010-09-10 17:29:47
第一个解决方案是使用递归来检索每个页面的子级。但是,当页面数量变得很大时,这会导致大量的查询,特别是当它们嵌套得很深的时候。
您可能希望将this blog-entry看作是通过一个查询检索所有页面,然后使用映射访问某个页面的子页面。
发布于 2010-09-10 17:19:04
你想用递归来解决这个问题吗?这是我最近用来解决类似问题的一些示例代码
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);
}
}发布于 2010-09-10 17:19:46
编辑表,将名为subcat的新字段设置为INT 1= true 0= false
创建ifstatement来查找值,如果是,则转到while循环,否则我猜什么都不做?
https://stackoverflow.com/questions/3683428
复制相似问题