PHP简易无限级分类工具类

无限级分类在我们开发过程中应该是经常遇到的,今天记录下自己通过引用传值的方式来实现无限级分类:

工具类

<?php

namespace App\Utils;


class CategoryUtil
{
    /**
     * 数组无限极分类
     * @param array $array
     * @param string $primary_key
     * @param string $parent_key
     * @param string $childrenName
     * @return array
     */
    public static function generateTree(array $array, string $primary_key = 'id', string $parent_key = 'pid', string $childrenName = 'children'): array
    {
        //构造数据
        $items = [];
        foreach ($array as $row) {
            $row = (array)$row;
            $items[$row[$primary_key]] = $row;
        }
        //遍历数据 生成树状结构
        $tree = [];
        foreach ($items as $key => $item) {
            if (isset($items[$item[$parent_key]])) {
                $items[$item[$parent_key]][$childrenName][] = &$items[$key];
            } else {
                $tree[] = &$items[$key];
            }
        }
        return $tree;
    }
}

工具说明

变量类型说明
array数组传入数据结构,用来重构数据
primary_key字符串传入主键"主ID",用来给PID做主键递归
parent_key字符串传入副键,"副PID",用来寻找主键ID做递归
childrenName字符串传入递归分类层键名

使用工具

  1. 在PHP项目中引入该工具类
  2. 调用generateTree方法
  3. 准备数组结构
<?php
        $menu = [
            [
                "id" => 1,
                "name" => "[1]主菜单",
                "pid" => 0,
            ],
            [
                "id" => 2,
                "name" => "二级菜单",
                "pid" => 1,
            ],
            [
                "id" => 3,
                "name" => "三级菜单",
                "pid" => 2,
            ]
        ];
?>

调用Category工具类(传入数组结构)

<?php
$arr = CategoryUtil::generateTree($menu);
?>

数据结果


Array
(
    [0] => Array
        (
            [id] => 1
            [name] => [1]主菜单
            [pid] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [name] => 二级菜单
                            [pid] => 1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 3
                                            [name] => 三级菜单
                                            [pid] => 2
                                        )

                                )

                        )

                )

        )

)
最后修改:2021 年 11 月 08 日 08 : 13 PM