例如,我想从数据库中提取几行:
例如,它们有 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/