从元素内部的数据库元素中提取,依此类推

时间:2016-07-26 20:45:41

标签: 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个......我该怎么做?)

3 个答案:

答案 0 :(得分:1)

没有进入关于如何从数据库中取出内容的整个教程,只需说明使用fetchObject而不是获取数组的方法之一以使此方法起作用就足够了:

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

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

这将使用id作为键来获取stdClass对象的数组。由于PHP中有the way objects are passed,因此构建树比使用多维数组更容易。

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级的任何东西来测试它,但理论上它可以无限深度地工作。将东西放入数据库时​​要小心,不要创造属于自己后代的东西,否则你会在时空连续体中创造一个裂缝并破坏宇宙,或者至少是你的脚本。

答案 1 :(得分:0)

使用精确的工作示例更新。

你的主题是我也在努力的主题。它有一个与mysql或mysqli相关联的标题“多维数组”。

第1步:数据库..

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/

最后,如果这符合您的需求,请不要忘记接受答案。

答案 2 :(得分:-3)

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