Re: [請益]商品型錄分層問題
手癢, 寫個script僅供參考, 已測試過可得正確結果. 若有需要請自行修改
為符合需求的版本.
<?php
//假設從資料庫撈出來的 $folder_all 的資料結構如下:
$folder_all=array(
0=>array('ID'=>1,'ParentId'=>0,'Title'=>'服飾鞋包'),
1=>array('ID'=>2,'ParentId'=>1,'Title'=>'女鞋'),
2=>array('ID'=>3,'ParentId'=>2,'Title'=>'高跟鞋'),
3=>array('ID'=>4,'ParentId'=>3,'Title'=>'涼鞋'),
4=>array('ID'=>5,'ParentId'=>1,'Title'=>'男鞋'),
5=>array('ID'=>6,'ParentId'=>5,'Title'=>'皮鞋'),
6=>array('ID'=>7,'ParentId'=>1,'Title'=>'XXXXXXX'),
7=>array('ID'=>8,'ParentId'=>7,'Title'=>'OO'),
8=>array('ID'=>9,'ParentId'=>8,'Title'=>'XX')
);
//先將資料庫的父子節點關聯結構 轉成 php array 的結構:
$relations = array();
foreach($folder_all as $folder):
$pid = $folder['ParentId'];
$id = $folder['ID'];
$relations[$pid][]=$id;
endforeach;
//另外,調整$folder_all的索引, 不用流水號, 而以ID替代之:
$data[0]=array('ID'=>0,'Title'=>'所有分類');
foreach($folder_all as $row):
$data[$row['ID']]=$row;
endforeach;
//最後, 再以遞迴呼叫的方式將父子關聯輸出:
tree_show($relations,$data,$stream,0);
echo iconv('utf-8','big5',$stream);
//遞迴輸出函式
//$relations: 父子關聯結構, 以php array的方式表達.
//$data: 從資料庫撈出來的原始資料錄, 而每筆記錄的索引以'ID'建立.
//$stream: 輸出用的暫存變數. 在遞迴函式當中用來吸附每一層的輸出結果.
//$parent_key: 代表父子關聯當中的'父'的ID.
//$layer: 層數, 預設最高層為0, 每下一層就加1
function tree_show(&$relations,&$data,&$stream,$parent_key,$layer=0){
//用空格代表層數:
for($i=0;$i<$layer;$i++)
$stream.=' ';
//輸出parent資料:
$stream.=$data[$parent_key]['Title']."\r\n";
if($relations[$parent_key]):
foreach($relations[$parent_key] as $child_key):
tree_show($relations,$data,$stream,$child_key,$layer+1);
endforeach;
endif;
}
?>
在cli模式下執行:
php -q kk.php
輸出結果:
所有分類
服飾鞋包
女鞋
高跟鞋
涼鞋
男鞋
皮鞋
XXXXXXX
OO
XX
※ 引述《luo74128 (小貓)》之銘言:
: 請益各位大大一個我百思不解的問題,非常感謝。
: 資料表格式_folder 是分類表 有 ID,ParentId(父類別)......(剩下的Title Content之
: 類的)
: 資料表格式_article 是主表 有 ID,ParentId(父類別),FolderId(關聯_folder表的
: ID).......(剩下的Title Content之類的)
: 我是想要做一個商品型錄(無限層)利用上面兩張表
: ID ParentId Title
: 1←0 服飾鞋包
: ↘
: 2←1 女鞋
: ↓
: 3↓1 男鞋
: ↘
: 4←2 高跟鞋
: ↓
: 5↓3 皮鞋
: ↘
: 6 4 涼鞋
: 我的問題是如何把上面資料表的資料排列成樹狀圖
: 例如
: 服飾鞋包
: |--女鞋
: | |--高跟鞋
: | |--涼鞋
: |
: |--男鞋
: |-皮鞋
: XXXXXXX
: |--OO
: | |--XX
: |
: |
: 下面是我寫的CODE
: 但是只能顯示出
: 服飾鞋包
: |--女鞋
: |--高跟鞋
: |--涼鞋
: XXXXXXX
: |--OOOO
: |--AAAA
: |--BBBB
: 以上面的例子來說
: 少了一層男鞋的(就是第二層的無限分類)
: 也就是說我只有第一層可無限分類,後面的就不能分類了。
: 在這裡先感謝各位大大無私的分享~真的非常感謝
: $bind = $this->_bind;
: $folder_all = $this->_db->query("
: SELECT *
: FROM `/*prefix*//*module*/_folder`
: WHERE Status = 'open'
: ",$bind)->fetchAll();
: $p = 0;
: for($j=0;$j<count($folder_all);$j++){
: if($folder_all[$j][ParentId]==0){
: $id = $folder_all[$j][Id];
: $k = 0;
: $a[$p][$k][Title] = $folder_all[$j][Title];
: $a[$p][$k][ParentId] = $folder_all[$j][ParentId];
: $a[$p][$k][Id] = $folder_all[$j][Id];
: $k = 1;
: for($i=0;$i<count($folder_all);$i++){
: if($folder_all[$i][ParentId]==$id){
: $a[$p][$k][Title] = $folder_all[$i][Title];
: $a[$p][$k][ParentId] = $folder_all[$i][ParentId];
: $a[$p][$k][Id] = $folder_all[$i][Id];
: $id = $folder_all[$i][Id];
: $i=-1;
: $k++;
: }
: }
: }
: $p++;
: }
: $this->assign['folder_all'] = $a;
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 58.115.151.184
討論串 (同標題文章)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章
0
16