PHP 无限分类 无限分类数据展示 树形结构数据

一、无限分类表 

id 

name 分类名

pid     父级id

二、代码

//定义需要处理的数据
$data = [
    [ 'id' => 1, 'pid' => 0, 'name' => '手机' ],
    [ 'id' => 2, 'pid' => 1, 'name' => 'A手机' ],
    [ 'id' => 3, 'pid' => 2, 'name' => 'A手机充电器' ],
    [ 'id' => 4, 'pid' => 2, 'name' => 'A手机耳机' ],
    [ 'id' => 5, 'pid' => 1, 'name' => 'B手机' ],
    [ 'id' => 6, 'pid' => 5, 'name' => 'B手机充电器' ],
    [ 'id' => 7, 'pid' => 5, 'name' => 'B手机耳机' ],
    [ 'id' => 8, 'pid' => 7, 'name' => '左耳机' ],
    [ 'id' => 9, 'pid' => 7, 'name' => '右耳机' ],
    ['id' => 10, 'pid' => 0, 'name' => '手机C']
];
$treeData = generateTree($data);  //处理成数据结构数据
$result = []; //定义结果数据
handleTreeData($treeData, '', '', $result); //把树形结果数据处理成最终数据
var_export($result);die;

/**
 * 处理成树形结构数据
 * @param $list
 * @param string $pk
 * @param string $pid
 * @param string $child
 * @param int $root
 * @return array
 */
function generateTree($list, $pk = 'id', $pid = 'pid', $child = 'children', $root = 0)
{
    $tree     = array();
    $packData = array();
    foreach ($list as $data) {
        $packData[$data[$pk]] = $data;
    }

    foreach ($packData as $key => $val) {
        if ($val[$pid] == $root) {
            $tree[] = &$packData[$key]; //代表根节点, 重点一
        } else {
            $packData[$val[$pid]][$child][] = &$packData[$key]; //找到其父类,重点二
        }
    }
    return $tree;
}

/**
 * 递归处理树形结构的数据
 * @param $treeData 树形结构数据
 * @param $fatherName 父级 $name
 * @param $detailName 详情 $name
 * @param $result 结果数据
 */
function handleTreeData($treeData, $fatherName, $detailName, &$result) {
    $detailName .=   $fatherName ? ($fatherName . ' - ') : ''; //child下有数据,则追加该child的$fatherName信息

    foreach ($treeData as $value) {
        $name = $value['name']; //单条数据的详细信息

        $result[] = [ //数据追加
            'id' => $value['id'],
            'name' => $detailName . $name
        ];

        if (isset($value['children'])) {    //如果child存在,则循环单个child下的数据
            handleTreeData($value['children'], $name, $detailName, $result);
        }
    }
}

generteTree方法得到树形结构数据  handleTreeData得到数据

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值