php - 从数据库元素中提取元素等

标签 php html sql

例如,我想从数据库中提取几行:

例如,它们有 id, name, parent

0, element1, noparent
1, element2, 0
2, element3, 1
3, element4, 2

等等……

我想将它们一个输出到另一个(在 html 中)

<div id=0 data-name=element1>
    <div id=1 data-name=element2>
        <div id=2 data-name=element3>
            <div id=3 data-name=element4>
            </div>
        <div>
    </div>
</div>

并且可以有很多可能性。那么我需要的是如何依靠 parent 将它们一个输出到另一个?

(再一次,(如果你不明白 :))它们可以是 100 个一个在另一个里面......我该怎么做?)

最佳答案

无需进入有关如何从数据库中获取内容的完整教程,只要说使用 fetchObject 很重要就够了。而不是为了使这种方法起作用而获取数组的方法之一:

$stmt = $pdo->query('SELECT id, name, parent FROM your_table');

while ($row = $stmt->fetchObject()) {
    $data[$row->id] = $row;
}

这将为您提供一组使用 id 作为键的 stdClass 对象。因为the way objects are passed在 PHP 中,构建树比使用多维数组要容易得多。

foreach ($data as $element) {
    if ($element->parent !== null) {
        $data[$element->parent]->children[] = $element;
    }
}
$tree = array_filter($data, function($x) { return $x->parent === null; });

如果你很难看出这是在做什么,你可以在不同的点var_dump $data$tree 数组来看看它们的样子(或者更好,使用 actual debugger )。这不应该像看起来那样难以内存,因为进入 children[] 的东西是对象标识符的副本,而不是整个对象的新副本。 array_filter 步骤只是将数组限制为根级(无父级)元素。

构建树后,您可以使用 recursive 以您想要的格式输出它功能。

function outputTree($tree) {
    $output = '';
    foreach ($tree as $branch) {        
        $output .= "<div id='$branch->id' data-name='$branch->name'>";
        if (isset($branch->children)) {
            $output .= outputTree($branch->children);
        }
        $output .= '</div>';
    }
    return $output;
}

echo outputTree($tree);

我还没有用接近 100 级的任何东西对此进行测试,但理论上它可以工作到无限深度。将事物放入数据库时​​请小心,不要创建它们自身的后代,否则您将在时空连续体中制造裂缝并摧毁宇宙,或者至少是您的脚本。

关于php - 从数据库元素中提取元素等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38599555/

相关文章:

php - Laravel 编辑本地化

php - 内容管理系统 : How to handle internal URLs best?

php - 无效使用组函数的初学者 MySQL 问题

javascript - 如何使用 javascript 在 PHP 中发送单选按钮值?

javascript - D3 排序条形图错误 n.each

html - 悬停框位置问题

javascript - 水平滚动 Div

mysql - SQL Server 中多个子级的 XML 读取

java - 根本原因 java.lang.ClassNotFoundException : com. mysql.jdbc.Driver

mysql - 如何复制最后插入的行并将其粘贴到 SQL 中的其他表中?