【发布时间】:2014-07-17 22:46:57
【问题描述】:
我正在尝试构建一个递归菜单,它在完成后看起来像这样,具有无限数量的嵌套项:
Homepage
Services
Members
Brokers
Insurers
Products
我的数据通过我表中的一个简单的parent_id 列链接在一起。
我目前已经设法抓取表格中的所有页面,并根据它们的parent_id 将它们添加到一个数组中(见下文)。
Array
(
[0] => 0-0-1 0-1-2 0-2-12 0-3-27 0-4-28 0-5-29 0-6-30 0-7-31 0-8-33
[2] => 2-0-3 2-0-6 2-0-7 2-0-8
[3] => 3-0-4 3-0-5
[8] => 8-0-9 8-0-10
[12] => 12-0-13 12-0-20
[13] => 13-0-14 13-1-15 13-2-17 13-3-16 13-4-19 13-5-18 13-9-34
[20] => 20-0-21 20-1-22 20-2-24 20-3-23 20-4-26 20-5-25 20-6-11
)
这被格式化为 [parent_id] => parent_id-sort_order-id parent_id-sort_order-id 等等。
到目前为止我的代码如下:
$sqlGetDropdownPages = "SELECT * FROM `cms_staticPages` ORDER BY `sortOrder` ASC";
$qryGetDropdownPages = mysql_query($sqlGetDropdownPages) or die(mysql_error());
$resGetDropdownPages = mysql_fetch_assoc($qryGetDropdownPages);
$totGetDropdownPages = mysql_num_rows($qryGetDropdownPages);
do {
$pageArray[$resGetDropdownPages['parent_id']] .= $resGetDropdownPages['parent_id'].'-'.$resGetDropdownPages['sortOrder'].'-'.$resGetDropdownPages['id'].' ';
} while($resGetDropdownPages = mysql_fetch_assoc($qryGetDropdownPages));
ksort($pageArray);
foreach($pageArray as $i => $value) {
$explodePages = explode(' ',$value);
foreach(array_filter($explodePages) as $i2 => $page) {
$pageInfoExplode = explode('-',$page);
$getPageInfo = mysql_fetch_assoc(mysql_query("SELECT * FROM `cms_staticPages` WHERE `id` = '".$pageInfoExplode[2]."'"));
echo $getPageInfo['identifier'].'<br />';
}
}
此时遇到了一堵砖墙,不知道下一步该做什么。
我已尽力解释这一点,所以如果需要任何澄清,请尽管询问。
如何做到这一点?
【问题讨论】:
-
我建议不要用空格分隔连字符分隔的条目,而是用字符串索引构建一个多维数组结构。这可以防止你发疯(不过没有承诺)。
-
您应该认真考虑使用nested set。有一篇关于如何使用 MySQL here 实现它们的优秀文章(滚动过去邻接列表部分)。把你的头绕起来可能有点棘手,但这是在 MySQL 等 RDBMS 中存储树的更好方法
-
@Bojangles 这似乎是一个不错的主意,但我需要它才能用于选择菜单。我正在尝试类似于 WordPress 页面的东西,您可以在父页面下添加新页面。这会相对容易实现吗?
标签: php arrays sorting recursion