【问题标题】:PHP and MySQL find all children and grandchildren of parents in databasePHP和MySQL在数据库中查找父母的所有子孙
【发布时间】:2014-02-26 14:36:19
【问题描述】:

我正在尝试实现以下目标: Get all child, grandchild etc nodes under parent using php with mysql query results

但我希望在不将所有内容放入数组且不嵌套 if 语句的情况下执行此操作 - 只需逐个浏览第一级,然后: - 打印项目 - 如果该项目有一个孩子找到它并打印它 - 如果孩子有孩子找到并打印 - 如果孩子没有孩子,则向上一级并寻找下一个孩子或项目,它是孩子 - 依此类推……最好放入一组 UL LI 列表和子列表

我的数据库和输出也需要排序,所以看起来更像这样:

id     name       parent_id     orderby
1  Electronics          0         0
2  Televisions          1         10
3  Portable Electronics 1         20
4  Tube                 2         20
5  LCD                  2         10
6  Plasma               2         30
7  Mp3 Players          3         30
8  CD Players           3         20
9  2 Way Radios         3         10
10 Flash                7         10

我可以使用 if 语句来做到这一点,但要做到这一点,我需要知道最深的孩子有多少层,以及是否有 7 个层会变得混乱。我已经看到它(在上面的链接中)放入了一个多维数组,但似乎您需要为每个语句嵌套才能再次获取数据,这与嵌套 if 解决方案几乎相同。

我很确定答案就在我的眼皮底下,但在这里或其他地方找不到......

WordPress 似乎有办法做到这一点,但我无法找到那里的代码。

任何帮助将不胜感激!

【问题讨论】:

  • 我不确定我是否理解您期望输出完成后的样子。你能举个例子吗?
  • orderBy 是干什么用的?
  • 您可以使用递归实现任何级别的嵌套解决方案。
  • 现在我想创建一个页面,列出网站上的所有页面(如 Windows 中的文件管理器)。我需要 orderby,因为显示页面(及其子项)的顺序很重要。是不是清楚一点?

标签: php mysql


【解决方案1】:

使用以下代码获取数据:

function getChildren($parent) {
    $query = "SELECT * FROM tableName WHERE parent_id = $parent";
    $result = mysql_query($query);
    $children = array();
    $i = 0;
    while($row = mysql_fetch_assoc($result)) {
        $children[$i] = array();
        $children[$i]['name'] = $row['name'];
        $children[$i]['children'] = getChildren($row['id']);
    $i++;
    }
return $children;
}

使用

调用这个函数
$finalResult = getChildren('*');

詹姆斯编辑

只是为了完成这个答案,将结果打印到列表中:

<?php
    function printList($array = null) {
        if (count($array)) {
            echo "<ul>";

            foreach ($array as $item) {
                echo "<li>";
                echo $item['name'];
                if (count($item['children'])) {
                    printList($item['children']);
                }
                echo "</li>";
            }

            echo "</ul>";
        }
    }

    printList($finalResult);
?>

【讨论】:

  • 也许我不关注。但这只会得到父母的直系子女吗?如果孩子有任何级别的孩子等等怎么办?
  • @Doodled 这就是他们在while 循环中再次调用getChildren 的原因。
  • 另外,也许您应该调用 $finalResult = getChildren('0'); 而不是 * 以仅从初始调用中获得第一级。
  • 太美了!!!并感谢 James 添加输出函数 - 我第一次看到以如此干净的方式输出的多维数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2021-11-10
  • 2013-06-29
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多