从数据库中提取元素内部的元素等等


Extract from database elements inside elements and so on

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

它们具有例如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/

最后,如果这能满足您的需求,请不要忘记接受答案

查询数据库。结果可以存储在数组中。然后遍历数组并返回结果。