分類表,比如category,字段有 id,parentid,title,查詢時,我們希望得到有層級關系的數組,就是頂級是頂級分類,然后每個分類中有個children子數組,記錄它的子分類,這樣一級一級的分級數組,代碼如下:
- //查詢
- $dsql->SetQuery("SELECT * FROM category ORDER BY sortorder ASC");
- $dsql->Execute('parentlist');
- $array = array();
- $parentlist = array();
- while ($rs=$dsql->getObject('parentlist'))
- {
- if($rs->parentid == 0)
- {
- $parentlist[$rs->id] = (array)$rs;
- }
- else
- {
- $array[$rs->id] = (array)$rs;
- }
- }
- $parentlist = cat_options($parentlist, $array); //我們求的結果數組
- //$list父級分類的數組
- //$array是除父級分類外的全部分類的數組
- function cat_options(&$list,&$array)
- {
- foreach ($list as $key => $arr)
- {
- foreach ($array as $k => $value)
- {
- if($value['parentid'] == $arr['id'])
- {
- $list[$key]['children'][] = $value;
- unset($array[$k]);
- }
- }
- }
- foreach ($list as $key => $arr)
- {
- if(is_array($arr['children']) && count($arr['children']) > 0)
- {
- $list[$key]['children'] = cat_options($list[$key]['children'], $array);
- }
- }
- return $list;
- }
好了現在給大家推薦一個無限分類的函數,代碼如下:
- <?php
- //模擬PHP無限分類查詢結果
- return array(
- array(
- ‘id’=>1,
- ‘pid’=>0,
- ‘name’=>‘主頁’
- ),
- array(
- ‘id’=>2,
- ‘pid’=>0,
- ‘name’=>‘新聞’
- ),
- array(
- ‘id’=>3,
- ‘pid’=>0,
- ‘name’=>‘媒體’
- ),
- array(
- ‘id’=>4,
- ‘pid’=>0,
- ‘name’=>‘下載’
- ),
- array(
- ‘id’=>5,
- ‘pid’=>0,
- ‘name’=>‘關于我們’
- ),
- array(
- ‘id’=>6,
- ‘pid’=>2,
- ‘name’=>‘天朝新聞’
- ),
- array(
- ‘id’=>7,
- ‘pid’=>2,
- ‘name’=>‘海外新聞’
- ),
- array(
- ‘id’=>8,
- ‘pid’=>6,
- ‘name’=>‘州官新聞’
- ),
- array(
- ‘id’=>9,
- ‘pid’=>3,
- ‘name’=>‘音樂’
- ),
- array(
- ‘id’=>10,
- ‘pid’=>3,
- ‘name’=>‘電影’
- ),
- array(
- ‘id’=>11,
- ‘pid’=>3,
- ‘name’=>‘小說’
- ),
- array(
- ‘id’=>12,
- ‘pid’=>9,
- ‘name’=>‘鈴聲’
- ),
- array(
- ‘id’=>13,
- ‘pid’=>9,
- ‘name’=>‘流行音樂’
- ),
- array(
- ‘id’=>14,
- ‘pid’=>9,
- ‘name’=>‘古典音樂’
- ),
- array(
- ‘id’=>15,
- ‘pid’=>12,
- ‘name’=>‘熱門鈴聲’
- ),
- array(
- ‘id’=>16,
- ‘pid’=>12,
- ‘name’=>‘搞笑鈴聲’
- ),
- array(
- ‘id’=>17,
- ‘pid’=>12,
- ‘name’=>‘MP3鈴聲’
- ),
- array(
- ‘id’=>18,
- ‘pid’=>17,
- ‘name’=>‘128K’
- ),
- array(
- ‘id’=>19,
- ‘pid’=>8,
- ‘name’=>‘娛樂新聞’
- ),
- array(
- ‘id’=>20,
- ‘pid’=>11,
- ‘name’=>‘穿越類’
- ),
- array(
- ‘id’=>21,
- ‘pid’=>11,
- ‘name’=>‘武俠類’
- ),
- );
- ?>
無限分類函數,代碼如下:
- <?php
- /**
- * Tree 樹型類(無限分類)
- * @version 1.0
- * @access public
- * @example
- * $tree= new Tree($result);
- * $arr=$tree->leaf(0);
- * $nav=$tree->navi(15);
- */
- class Tree {
- private $result;
- private $tmp;
- private $arr;
- private $already = array();
- /**
- * 構造函數
- *
- * @param array $result 樹型數據表結果集
- * @param array $fields 樹型數據表字段,array(分類id,父id)
- * @param integer $root 頂級分類的父id
- */
- public function __construct($result, $fields = array('id', 'pid'), $root = 0) {
- $this->result = $result;
- $this->fields = $fields;
- $this->root = $root;
- $this->handler();
- }
- /**
- * 樹型數據表結果集處理
- */
- private function handler() {
- foreach ($this->result as $node) {
- $tmp[$node[$this->fields[1]]][] = $node;
- }
- krsort($tmp);
- for ($i = count($tmp); $i > 0; $i--) {
- foreach ($tmp as $k => $v) {
- if (!in_array($k, $this->already)) {
- if (!$this->tmp) {
- $this->tmp = array($k, $v);
- $this->already[] = $k;
- continue;
- } else {
- foreach ($v as $key => $value) {
- if ($value[$this->fields[0]] == $this->tmp[0]) {
- $tmp[$k][$key]['child'] = $this->tmp[1];
- $this->tmp = array($k, $tmp[$k]);
- }
- }
- }
- }
- }
- $this->tmp = null;
- }
- $this->tmp = $tmp;
- }
- /**
- * 反向遞歸
- */
- private function recur_n($arr, $id) {
- foreach ($arr as $v) {
- if ($v[$this->fields[0]] == $id) {
- $this->arr[] = $v;
- if ($v[$this->fields[1]] != $this->root) $this->recur_n($arr, $v[$this->fields[1]]);
- }
- }
- }
- /**
- * 正向遞歸
- */
- private function recur_p($arr) {
- foreach ($arr as $v) {
- $this->arr[] = $v[$this->fields[0]];
- if ($v['child']) $this->recur_p($v['child']);
- }
- }
- /**
- * 菜單 多維數組
- *
- * @param integer $id 分類id
- * @return array 返回分支,默認返回整個樹
- */
- public function leaf($id = null) {
- $id = ($id == null) ? $this->root : $id;
- return $this->tmp[$id];
- }
- /**
- * 導航 一維數組
- *
- * @param integer $id 分類id
- * @return array 返回單線分類直到頂級分類
- */
- public function navi($id) {
- $this->arr = null;
- $this->recur_n($this->result, $id);
- krsort($this->arr);
- return $this->arr;
- }
- /**
- * 散落 一維數組
- *
- * @param integer $id 分類id
- * @return array 返回leaf下所有分類id
- */
- public function leafid($id) {
- $this->arr = null;
- $this->arr[] = $id;
- $this->recur_p($this->leaf($id));
- return $this->arr;
- }
- }
- ?>
新聞熱點
疑難解答