我們來給大家介紹一下關於在php中無發限分類的一些用法,包括有直接無限分類數據庫與數組的操作,有需要的朋友可參考參考。
先看一個php與mysql數據庫的無限分類
建立數據庫 :
id,fid,fname(id和fid都必需是數字類型而且fid的默認值一定要設成0;
<?php
$stime=microtime();
$db=@mysql_connect("localhost","root","micronsky.net") or die("數據庫連接失入");
mysql_select_db("temp",$db);
//定義第一級分類
function mainfl()
{
global $db;
$result=mysql_query("select id,fid,fname from wxjfl where fid=0 order by id desc",$db);
if ($myrow=mysql_fetch_array($result)) {
do {
echo $myrow["fname"];
echo "<br>";
echo subfl($myrow["id"]," "); //此處調用子級分類函數
}
while ($myrow=mysql_fetch_array($result));
}
}
//定義子級分類
function subfl($fid,$strdis)
{
global $db;
$result1=mysql_query("select id,fid,fname from wxjfl where fid=$fid order by id desc",$db);
if ($myrow1=mysql_fetch_array($result1)) {
do {
//echo $strdis;
echo $strdis.$myrow1["fname"];
echo "<br>";
subfl($myrow1["id"]," ".$strdis); //這裡一定要注意並不需要像上面那個函數那樣echo ...只要直接調用子級分類函數並付值就行了!同時這裡也是遞歸部分
}
while ($myrow1=mysql_fetch_array($result1));
}
}
echo mainfl();
$ltime=microtime();
echo "<br>";
echo number_format($ltime-$stime,4); //統計執行時間,這裡就比ASP快多了,但這跟寫法沒多大關系,主要是PHP本身加入了加速器的原因!
?>
現在我們直接利用數組進行分頁
/**
* 創建父節點樹形數組
* 參數
* $ar 數組,鄰接列表方式組織的數據
* $id 數組中作為主鍵的下標或關聯鍵名
* $pid 數組中作為父鍵的下標或關聯鍵名
* 返回 多維數組
**/
function find_parent($ar, $id='id', $pid='pid') {
foreach($ar as $v) $t[$v[$id]] = $v;
foreach ($t as $k => $item){
if( $item[$pid] ){
if( ! isset($t[$item[$pid]]['parent'][$item[$pid]]) )
$t[$item[$id]]['parent'][$item[$pid]] =& $t[$item[$pid]];
$t[$k]['reference'] = true;
}
}
return $t;
}
/**
* 創建子節點樹形數組
* 參數
* $ar 數組,鄰接列表方式組織的數據
* $id 數組中作為主鍵的下標或關聯鍵名
* $pid 數組中作為父鍵的下標或關聯鍵名
* 返回 多維數組
**/
function find_child($ar, $id='id', $pid='pid') {
foreach($ar as $v) $t[$v[$id]] = $v;
foreach ($t as $k => $item){
if( $item[$pid] ) {
$t[$item[$pid]]['child'][$item[$id]] =& $t[$k];
$t[$k]['reference'] = true;
}
}
return $t;
}
示例:
代碼如下 復制代碼 $data = array(
上面兩種方法是將所有節點按id平攤到一個數組中,然後找到他們的 parent 或 children ,通過引用將 平攤的元素掛接到 parent 、children 下,
但被引用的元素依然存在於平攤的數組中,因此,在實際應用時,最好標記那些被引用的元素,以避免以他們為根開始遍歷,導致重復。
代碼如下 復制代碼
foreach ($p as $key => $item) {
if($item['reference']) continue;
print_r($item);
}
foreach ($c as $key => $item) {
if($item['reference']) continue;
print_r($item);
}
遞歸法,PHP 數組元素被刪除後,數組游標會歸零,因此在遍歷過程中一些已經找到 “歸宿” 的元素也不得不留在數組中,無法縮減後繼元素的搜索范圍:
代碼如下 復制代碼
$mylist = array(array( 'parent_id'=>0,'id'=>1),
array( 'parent_id'=>0,'id'=>2),
array( 'parent_id'=>0,'id'=>3),
array( 'parent_id'=>2,'id'=>4),
array( 'parent_id'=>2,'id'=>5),
array( 'parent_id'=>3,'id'=>6),
array( 'parent_id'=>3,'id'=>7),
array( 'parent_id'=>4,'id'=>8),
array( 'parent_id'=>5,'id'=>9),
array( 'parent_id'=>5,'id'=>10)
);
function _findChildren($list, $p_id){ //數據層級化,
$r = array();
foreach($list as $id=>$item){
if($item['parent_id'] == $p_id) {
$length = count($r);
$r[$length] = $item;
if($t = $this->_findChildren($list, $item['id']) ){
$r[$length]['children'] = $t;
}
}
}
return $r;
}
print_r(_findChildren($mylist, 0));