<?php
/*
利用数据库表实现无限级分类
数据库表的设计思路:
id name pid path
1 java 0 0
2 php 0 0
3 java基础 1 0-1
4 php基础 2 0-2
5 java数组 3 0-1-3
6 php变量 4 0-2-4
说明:
pid 父类id
path 整个分类的路径 父类的id-子类的id
如果插入新的数据path列则可以父的path+新的id
*/
//模拟数据
$data = array(
array(
'id' => 1,
'name' => 'java',
'pid' => 0,
'path' => '0'
),
array(
'id' => 2,
'name' => 'php',
'pid' => 0,
'path' => '0'
),
array(
'id' => 3,
'name' => 'java基础',
'pid' => 1,
'path' => '0-1'
),
array(
'id' => 4,
'name' => 'php基础',
'pid' => 2,
'path' => '0-2'
),
array(
'id' => 5,
'name' => 'java数组',
'pid' => 3,
'path' => '0-1-3'
),
array(
'id' => 6,
'name' => 'php变量',
'pid' => 4,
'path' => '0-2-4'
),
);
/*
echo '<pre>';
print_r($data);
echo '</pre>';
*/
//设置分级字段
foreach($data as &$row) {
//计算-出现的个数
$num = substr_count($row['path'],'-');
if($row['pid'] > 0) {
//设置前缀字符 |--
$rep = '|'.str_repeat('--',$num);
}else {
$rep = '';
}
//在数组里设置一个新的字段,存储分级的结果
$row['tree'] = $rep.$row['name'];
}
//取得分级的排序数组
/*
思路:用path+id 取得一个数值。利用此数值来排序
Array (
[0] => 0-1
[1] => 0-2
[2] => 0-1-3
[3] => 0-2-4
[4] => 0-1-3-5
[5] => 0-2-4-6 )
*/
foreach($data as $row2) {
$arr[] = $row2['path'].'-'.$row2['id'];
}
//排序
array_multisort($arr, $data);//第二个数组根据对应第一个数组后也进行排序。
/*
$arr排序后的结果:
Array ( [0] => 0-1
[1] => 0-1-3
[2] => 0-1-3-5
[3] => 0-2
[4] => 0-2-4
[5] => 0-2-4-6 )
*/
//取得排序后的分级结果
foreach($data as $row3) {
echo $row3['tree'].'<br/>';
}
/*
java
|--java基础
|----java数组
php
|--php基础
|----php变量
*/