簡單版的PHP生成無限極分類代碼。其中包括了數據庫設計、以及輸出分類HTML代碼。
SQL代碼
CREATE TABLE `district` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`pid` int(10) unsigned NOT NULL,
`name` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
# 添加一些測試數據
INSERT INTO `district` (`id`, `pid`, `name`) VALUES
(1, 0, '中國'),
(2, 0, '美國'),
(3, 0, '日本'),
(4, 1, '北京'),
(5, 1, '上海'),
(6, 1, '廣州'),
(7, 2, '華盛頓'),
(8, 2, '紐約'),
(9, 3, '東京'),
(10, 3, '廣島'),
(11, 4, '朝陽區');
PHP代碼
header('Content-type:text/html;charset=utf-8');
$mysql = new mysqli('localhost', 'root', 'root', 'test');
$mysql->query('SET NAMES UTF8');
$result = $mysql->query('SELECT * FROM `district`');
while ($row = $result->fetch_assoc()) {
$district[$row['id']] = array('id' => $row['id'], 'pid' => $row['pid'], 'name' => $row['name']);
}
// $district結構如下所示:
$items = array(
1 => array('id' => 1, 'pid' => 0, 'name' => '中國'),
2 => array('id' => 2, 'pid' => 0, 'name' => '日本'),
3 => array('id' => 3, 'pid' => 0, 'name' => '美國'),
4 => array('id' => 1, 'pid' => 1, 'name' => '北京'),
// .......
// .......
11 => array('id' => 11, 'pid' => '4', 'name' => '朝陽區')
);
/**
* @方法一:將數據格式轉換成樹形結構數組
* @param array $items 要進行轉換的數組
* return array $items 轉換完成的數組
*/
function arrayToTree(Array $items) {
foreach ($items as $item) {
$items[$item['pid']]['son'][$item['id']] = &$items[$item['id']];
}
return isset($items[0]['son']) ? $items[0]['son'] : array();
}
/**
* @方法二:將數據格式轉換成樹形結構數組
* @param array $items 要進行轉換的數組
* return array $items 轉換完成的數組
*/
function arrayToTree2(Array $items) {
$tree = array();
foreach ($items as $item)
if (isset($items[$item['pid']])) {
$items[$item['pid']]['son'][] = &$items[$item['id']];
} else {
$tree[] = &$items[$item['id']];
}
return $tree;
}
/**
* 將樹形結構數組輸出
* @param array $items 要輸出的數組
* @param number $deep 頂級父節點id
*/
function exportTree($items, $deep = 0){
foreach ($items as $item) {
printf("%s%s", str_repeat('——', $deep), $item['name']);
if (!empty($item['son'])) {
exportTree($item['son'], $deep + 1);
}
}
}
測試
// 將數組轉換成樹形結構格式
$district = arrayToTree2($district);
// 輸出樹形結構圖
exportTree($district);
// 結果:
中國
——北京
————朝陽區
——上海
——廣州
美國
——華盛頓
——紐約
日本
——東京
——廣島