Re: [請益]商品型錄分層問題

看板PHP作者 (寶貝豬)時間16年前 (2010/01/25 17:59), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
手癢, 寫個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
文章代碼(AID): #1BNMk6z_ (PHP)
討論串 (同標題文章)
文章代碼(AID): #1BNMk6z_ (PHP)