PHP樹(shù)形結(jié)構(gòu)無(wú)限級(jí)分類(lèi)

參考地址:https://bubaijun.com/page.php?id=140
https://learnku.com/laravel/t/31828
https://wi1dcard.dev/posts/php-fastest-create-tree-from-list/

返回?cái)?shù)據(jù)是一維數(shù)組的代碼(以上方法只是進(jìn)行了排序,并不會(huì)對(duì)數(shù)組結(jié)構(gòu)進(jìn)行改變):

public function get_all_data()
{
    //TP框架查詢(xún)所有數(shù)據(jù):
    //$data = (new UserModel)->select();
    //Laravel 框架查詢(xún)所有數(shù)據(jù):
    $data = (new UserModel)->get();
    $res = $this->sort_data($data);
    dump($res);
}
 
public function sort_data($data, $pid = 0, $root = 1)
{
    static $new_data = [];
    //循環(huán)遍歷傳遞過(guò)來(lái)的數(shù)據(jù)
    foreach ($data as $key => $value) {
        //判斷數(shù)據(jù)的上級(jí) ID 是否等于當(dāng)前 ID,最頂級(jí) ID 為 0
        //這里的上級(jí) ID 在數(shù)據(jù)庫(kù)中的字段為 parent_id
        if ($value['parent_id'] == $pid) {
            $new_data[] = $value;
            $value['root'] = $root;

            // 去掉已經(jīng)處理過(guò)的數(shù)據(jù),這一步是關(guān)鍵,可以提高效率
            unset($data[$key]);

            //使用當(dāng)前數(shù)據(jù)記錄的 ID 進(jìn)行再次循環(huán)排序
            $this->sort_data($data, $value['id'], $root + 1);
        }
    }
    return $new_data;
}

有時(shí)候還會(huì)需要對(duì)數(shù)據(jù)進(jìn)行修改結(jié)構(gòu)。比如使用 Layui 的樹(shù)形組件,就會(huì)有這樣的數(shù)據(jù)格式要求:

public function sort_data($data, $pk = 'id', $pid = 'pid', $child = 'children', $root = 0)
{
    // 創(chuàng)建Tree
    $tree = [];
    if (!is_array($data)) {
        return false;
    }
 
    //創(chuàng)建基于主鍵的數(shù)組引用
    $refer = [];
    foreach ($data as $key => $value_data) {
        $refer[$value_data[$pk]] = &$data[$key];
    }
    foreach ($data as $key => $value_data) {
        // 判斷是否存在parent
        $parentId = $value_data[$pid];
        if ($root == $parentId) {
            $tree[] = &$data[$key];
        } else {
            if (isset($refer[$parentId])) {
                $parent = &$refer[$parentId];
                $parent[$child][] = &$data[$key];
            }
        }
    }
 
    return $tree;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容