<?php

namespace app\common\util;
class Tree
{
    /**
     * 示例数组
     * @var array|array[]
     */
    public array $array = [
        ['id' => 1, 'name' => 'ha1', 'parent_id' => 0],
        ['id' => 2, 'name' => 'ha2', 'parent_id' => 0],
        ['id' => 3, 'name' => 'ha3', 'parent_id' => 0],
        ['id' => 4, 'name' => 'ha4', 'parent_id' => 1],
        ['id' => 5, 'name' => 'ha5', 'parent_id' => 1],
        ['id' => 6, 'name' => 'ha6', 'parent_id' => 2],
    ];

    /**
     * 1级转1维数组无限极分类
     * @param array $array
     * @param int $parent_id
     * @return array
     */
    public function getTree(array $array, int $parent_id = 0): array
    {
        static $data = [];
        foreach ($array as $key => $value) {
            if ($value['parent_id'] == $parent_id) {
                $data[] = $value;
                unset($array[$key]);
                $this->getTree($array, $value['id']);
            }
        }
        return $data;
    }

    /**
     * 1级转2维数组数无限极分类
     * @param array $array
     * @return array
     */
    public function getTreeV2(array $array): array
    {
        $refer = [];
        $tree = [];
        foreach ($array as $key => $val) {
            $refer[$val['id']] = &$array[$key];
            $refer[$val['id']]['label'] = $val['name'];
        }
        foreach ($array as $k => $v) {
            $pid = $v['parent_id']; //获取当前分类的父级id
            if ($pid == 0) {
                $tree[] = &$array[$k]; //顶级栏目
            } else {
                if (isset($refer[$pid])) {
                    $refer[$pid]['children'][] = &$array[$k]; //如果存在父级栏目,则添加进父级栏目的子栏目数组中
                }
            }
        }
        return $tree;
    }

}