PHP 無限分類最佳實踐

高洛峰
發布: 2023-03-05 15:36:01
原創
1066 人瀏覽過

無限級分類

  • 是一種很常見,很必須的功能,幾乎每個項目都有。

  • 應用場景:下拉列表,樹型列表等

無限級分類的類型

  • 前端實現前端給定(前端框架已經實現了,只要後端傳遞給就可以產生了)

  • 後端實作(以下主要講這種實作)

無限級多種實作

  • 1、$data 已經asc排序過的所有資料

    2、$showFName
  • 顯示名字的欄位名稱(格式化過的)

3、$titleFName
標題的欄位名稱(無格式化)3、$titleFName
標題的欄位名稱(無格式化) 、$levelFName
層級欄位名稱5、$pidFName
父id的欄位名稱6、$idFName
id的欄位名稱
注意:

1、$data
    已經asc排序過的所有資料
  • 2、傳回的無限級列表資料都存在$treeList裡面

第三種

(使用靜態變數有限制:如果一次請求呼叫兩次來實現2個無限級分類就會出現問題,所以不推薦)

function infiniteSort($data, $showFName, $titleFName, $pidFName = 'pid', $idFName = 'id', $levelFName = 'level', $pid = 0, $level = 0)
{
    $tree = array();

    foreach ($data as $key => $value) {

        if ($value[$pidFName] == $pid) {
            $value[$levelFName] = $level;
            $value[$showFName] = str_repeat('  ', $level) . '|-' . $value[$titleFName];
            $tree[] = $value;
            unset($data[$key]);
            $tempArr = infiniteSort($data, $showFName, $titleFName, $pidFName, $idFName, $level, $value[$idFName], $level + 1);
            if(!empty($tempArr)){
                $tree = array_merge($tree, $tempArr);
            }
        }

    }

    return $tree;
}
登入後複製

注意:1、$list
    已經asc排序過的所有資料
  • 無限級分類
  • 是一種很常見,很必須的功能,幾乎每個項目都有。


應用場景:下拉列表,樹型列表等

無限級分類的類型

  • 前端實現前端給定(前端框架已經實現了,只要後端傳遞給就可以產生了)

  • 後端實作
  • (以下主要講這個實作)

    無限級多種實作
  • )注意:

    1、$data
  • 已經asc排序過的所有資料
  • 2、$showFName 顯示名字的欄位名稱(格式化過的)

    3、$titleFName
  • 標題的欄位名稱(無格式化)

4、$levelFName

層級欄位名稱
  • 5、$pidFName

    父id的欄位名稱6、$idFName

    id的欄位名稱

/**
 * 无限级分类
 * @param Array $treeList //接受处理完成数据的数组
 * @param Array $data //数据库里获取的结果集
 * @param String $level //格式化层级字段名
 * @param Int $pid
 * @param Int $count //第几级分类
 */
function tree(&$treeList, &$data, $level, $show_name, $field_name, $field_pid = 'pid', $field_id = 'id', $pid = 0, $count = 0)
{
    foreach ($data as $key => $value) {

        if ($value[$field_pid] == $pid) {
            $value[$level] = $count;
            $value[$show_name] = str_repeat('    ',$count).'|-'.$value[$field_name];
            $treeList[] = $value;
            unset($data[$key]);
            tree($treeList, $data, $level, $show_name, $field_name,$field_pid, $field_id, $value[$field_id], $count+1);
        }

    }
}
登入後複製

注意:1、$data 已經asc排序過的所有資料
2、傳回的無限級列表資料都存在$treeList裡面

第三種(如果一次靜態變數有使用靜態變數請求呼叫兩次來實現2個無限級分類就會出現問題,所以不建議)
    public function getTree($list, $parent_id, $level=0) {
        //应该是静态的局部变量,这样才能保证,在递归调用时,所有
        //的getTree方法,操作的是一个Tree空间。
        static $tree = array();//保存找到的分类的数组
        //遍历所有分类,通过parent_id判断,哪些是我们正在查找的
        foreach($list as $row) {
            //判断当前所遍历的分类$row, 是否是当前需要查找的子分类
            if($row['pid'] == $parent_id) {
                //找到了一个分类
                //存起来,存哪?
                $row['level'] = $level;
                $tree[] = $row;
                //继续查找当前$row所代表的分类的子分类
                $this->getTree($list, $row['id'], $level+1);
            }
        }
        return $tree;
    }
登入後複製
注意:
1、$list 已經asc排序過的所有資料
  • 更多PHP 無限級更多PH分類最佳實務相關文章請關注PHP中文網!

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板