PHP無限極分類實現


簡單版的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);

//  結果:

 中國
 ——北京
 ————朝陽區
 ——上海
 ——廣州
 美國
 ——華盛頓
 ——紐約
 日本
 ——東京
 ——廣島


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM