如何在树形视图中显示层次结构数据库?

5

出于某些原因,需要在两个不同的树形视图中显示来自mysql数据库的数据。

示例:

树形视图1(使用列表标记):

<li>level1 (Root)
 <ul>
  <li>level2</li>
  <li>level2
   <ul>
    <li>level3</li>
    <li>level3
     <ul>
      <li>level4</li>
      <li>level4</li>
     </ul>
    </li>
   </ul>
  </li>
  <li>level2
   <ul>
    <li>level3</li>
    <li>level3
     <ul>
      <li>level4</li>
      <li>level4</li>
     </ul>
    </li>
   </ul>
  </li>
 </ul>
</li>

树形视图2:

enter image description here

我目前正在开发这个PHP脚本:

<?php
$servername = "localhost";
$username = "root";
$password = "psswd_here";
$dbname = "db_here";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error)
{
    die("Connection failed: " . $conn->connect_error);
}

$data = array();
$index = array();
$sql2 = "SELECT * FROM categories ORDER BY name";
$result2 = $conn->query($sql2);

if ($result2->num_rows > 0)
{
        while ($row2 = $result2->fetch_assoc())
        {
                $id = $row2["id"];
                $parent_id = $row2["parent_id"] === NULL ? "NULL" : $row2["parent_id"];
                $data[$id] = $row2;
                $index[$parent_id][] = $id;
        }
}
else
{
    echo "0 results";
}

$conn->close();

function display_child_nodes($parent_id, $level)
{
    global $data, $index;
    $parent_id = $parent_id === NULL ? "NULL" : $parent_id;
    if (isset($index[$parent_id]))
        {
        foreach ($index[$parent_id] as $id)
                {
            echo str_repeat("-", $level) . $data[$id]["name"] . "<br>";
            display_child_nodes($id, $level + 1);
        }
    }
}

echo '<ul>';
display_child_nodes(NULL, 0);
echo '</ul>';
?>

输出:

Electronics
-Cameras and Photography
--Accessories
--Camcorders
--Digital Cameras
-Cell Phones and Accessories
--Accessories
--Cell Phones
--Smartphones
-Computers and Tablets
--Desktops
--Laptops
--Netbooks
--Tablets
---Android
---iPad
-TV and Audio
--Home Audio
--Speakers and Subwoofers
--Televisions
---CRT
---LCD
---LED
---Plasma

这里是数据库架构..
-- phpMyAdmin SQL Dump
-- version 4.4.12
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Generation Time: Oct 21, 2015 at 09:16 AM
-- Server version: 5.6.25
-- PHP Version: 5.6.11

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `binary`
--

-- --------------------------------------------------------

--
-- Table structure for table `categories`
--

CREATE TABLE IF NOT EXISTS `categories` (
  `id` int(10) NOT NULL,
  `parent_id` int(10) DEFAULT NULL,
  `name` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Dumping data for table `categories`
--

INSERT INTO `categories` (`id`, `parent_id`, `name`) VALUES
(1, NULL, 'Electronics'),
(2, 1, 'Cameras and Photography'),
(3, 1, 'Computers and Tablets'),
(4, 1, 'Cell Phones and Accessories'),
(5, 1, 'TV and Audio'),
(6, 2, 'Digital Cameras'),
(7, 2, 'Camcorders'),
(8, 2, 'Accessories'),
(9, 3, 'Laptops'),
(10, 3, 'Desktops'),
(11, 3, 'Netbooks'),
(12, 3, 'Tablets'),
(13, 4, 'Cell Phones'),
(14, 4, 'Smartphones'),
(15, 4, 'Accessories'),
(16, 5, 'Televisions'),
(17, 5, 'Home Audio'),
(18, 5, 'Speakers and Subwoofers'),
(19, 16, 'CRT'),
(20, 16, 'LCD'),
(21, 16, 'LED'),
(22, 16, 'Plasma'),
(23, 12, 'Android'),
(24, 12, 'iPad');

--
-- Indexes for dumped tables
--

--
-- Indexes for table `categories`
--
ALTER TABLE `categories`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `categories`
--
ALTER TABLE `categories`
  MODIFY `id` int(10) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=25;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

问题是什么? - e4c5
2个回答

1

以下是我的代码:

你只需要在这里加入与你设计完全匹配的CSS即可。

$servername = "localhost";
$username = "root";
$password = "psswd_here";
$dbname = "db_here";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error)
{
    die("Connection failed: " . $conn->connect_error);
}

function getCategory($parent_id){
    global $conn;
    $sql2 = "SELECT * FROM categories WHERE parent_id='".$parent_id."' ORDER BY name";
    $result2 = $conn->query($sql2);

    if (mysqli_num_rows($result2) > 0)
    {
        echo "<ul>";
        while ($row2 = mysqli_fetch_object($result2))
        {
            echo "<li>".$row2->name."</li>";
            getCategory($row2->id);     
        }
        echo "</ul>";
    }
}


//Set Parent id
$parent_id = 0;
getCategory($parent_id);

注意:根类别的 parent_id 是0。

0

这样可以添加类别级别的类

$conn = new mysqli("...");  

if ($conn->connect_error)
{
    die("Connection failed: " . $conn->connect_error);
}
    
$result = $conn->query("...");
$row = array();
while($row = $result->fetch_assoc()){
   $array[] = $row;
}       

    

function extract($array, $parent = null, $level = 0)
{
    if(count($array)) {
        echo '<ul class="level-'.$level.'">';
        foreach($array as $row) {
            if($row['id'] == $parent) {
                echo '<li>'.$row['name'].'</li>';
                $this->extract($array, $row['parent_id'], $level+1);
            }
        }
        echo '</ul>';
    }       
}

extract($array);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接