【问题标题】:Extract from database elements inside elements and so on从数据库元素中提取元素等
【发布时间】:2016-07-26 20:45:40
【问题描述】:

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

他们有,例如,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 一个在另一个里面......我该怎么做?)

【问题讨论】:

    标签: php html sql


    【解决方案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 个级别的东西对此进行测试,但理论上它可以无限深地工作。将事物放入数据库时​​请小心,不要创建它们自己的后代,否则您将在时空连续体中产生裂痕并破坏宇宙,或者至少破坏您的脚本。

    【讨论】:

      【解决方案2】:

      更新了一个确切的工作示例。

      您的主题是我也在努力解决的问题。它有一个与 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;
      

      }

      第三步:使用函数

         $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/

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 所以..你能花点时间给我举个例子吗..我有点初学者。 ty :))
        • stackoverflow.com/questions/4196157/…。这应该有助于解决您的问题以及对上述问题中的“儿童”项目使用递归函数。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        相关资源
        最近更新 更多