例如,我想从数据库中提取几行:
它们具有例如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对象数组。由于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
阵列,以查看它们的样子(或者更好的是,使用实际的调试器)。这对内存来说不应该像看起来那样困难,因为进入children[]
的是对象标识符的副本,而不是整个对象的新副本。array_filter
步骤只是将数组限制为根级别(没有父级)元素。
在构建了树之后,可以使用递归函数以所需的格式输出它。
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个级别的东西来测试过这个,但理论上它的深度是无限的。在将事物放入数据库时请小心,不要创建自己的后代,否则会在时空连续体中造成裂痕,破坏宇宙,或者至少破坏你的脚本。
更新了一个确切的工作示例
你的话题我也很纠结。它有一个与mysql或mysqli相关联的标题"多维数组"。
第一步:数据库。。
CREATE TABLE `tbl_categories` (
`id` int(11) NOT NULL,
`name` varchar(100) COLLATE utf8_bin NOT NULL DEFAULT '0',
`parent_id` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO `tbl_categories` (`id`, `name`, `parent_id`) VALUES
(1, 'element1', 0),
(2, 'element2', 1),
(3, 'element3', 2),
(4, 'element4', 3);
正如您所看到的,parent_id是您在项目中更改层次结构所需要的全部内容。
第2步:一个迭代条目的函数。。。
function categoryParentChildTree($parent = 0, $category_tree_array = '') {
global $dbConnection;
$parent = $dbConnection->real_escape_string($parent);
if (!is_array($category_tree_array)) //###
$category_tree_array = array();
$sqlCategory = "SELECT id,name,parent_id FROM tbl_categories WHERE parent_id = $parent ORDER BY id ASC";
$resCategory=$dbConnection->query($sqlCategory);
if ($resCategory->num_rows > 0) {
while($rowCategories = $resCategory->fetch_assoc()) {
$category_tree_array[] = array("id" => "<div id='".$rowCategories['id']."'", "name" => " data-name='".$rowCategories['name']."'>{$rowCategories['name']}");
$category_tree_array = categoryParentChildTree($rowCategories['id'], $category_tree_array);
}
}
return $category_tree_array;
}
步骤3:使用功能
$categoryList = categoryParentChildTree();
foreach($categoryList as $key => $value){
echo $value['id']." ".$value['name'];
}
这里非常重要的一行是我用###标记的那一行。这里的任务是检查传递的变量是否为数组。如果不是,该功能将继续。如果它是一个数组,函数会在同一个变量上调用自己,使其变平,并将其转换为过程中的变量。
整个事情的输出如下:
<html>
<head>
</head>
<body>
<div id="1" data-name="element1">element1
<div id="2" data-name="element2">element2
<div id="3" data-name="element3">element3
<div id="4" data-name="element4">element4
</div>
</div>
</div>
</div>
</body>
</html>
从理论上讲,这涉及到无限级别的嵌套和项。我希望它能有所帮助。
这是基于Saurabh Kumar Singh的教程。您可以从链接中看到功能齐全的原始演示和可下载的zip:http://demo.stepblogging.com/category-tree/
最后,如果这能满足您的需求,请不要忘记接受答案
查询数据库。结果可以存储在数组中。然后遍历数组并返回结果。