php实现无限级分类视频,PHP多种方式实现无限级分类

关于无限级分类,这是一个经常用到的知识点,做web开发,绝大多数的情况会使用到它。使用不同的方式实现就会有不一样的性能开销。对于国民级的递归实现方式,这是最简单也是最消耗性能的方式,而使用引用的方式来实现,开销则会小很多。

那么如何去选择?对于分类不多的项目,递归与引用的实现,性能开销相差无几;对于分类很多的项目,推荐使用引用的方式实现。

方式一 array_merge合并数组方式实现/**

* 方式一 array_merge合并数组方式实现

*

* @param array   $data     二维数组,需要递归的数组数据

* @param integer $pid      父ID,默认顶级分类

* @param integer $level    层次

*

* @return array  $arrTree  返回值,排序好的二维数组

*/

function makeTreeOne($data , $pid = 0 , $level = 0){

$arrTree = [];

foreach($data as $k => $v){

// 判断是否为上级分类

if($v['parentId'] == $pid){

$v['level'] = $level;

$arrTree[]  = $v;

// 此处是重点

// 递归调用查找下级分类,查找时会有返回值,将该返回值赋值给一个新变量

$res = makeTreeOne($data , $v['areaId'] , $level + 1);

// 删除遍历过的数据索引,减少性能开销

unset($data[$k]);

// 合并数组

$arrTree = array_merge($arrTree , $res);

}

}

return $arrTree;

}

方式二 静态变量方式实现/**

* 方式二 静态变量方式实现

*

* @param array   $data     二维数组,需要递归的数组数据

* @param integer $pid      父ID,默认顶级分类

* @param integer $level    层次

*

* @return array  $arrTree  返回值,排序好的二维数组

*/

function makeTreeTwo($data , $pid = 0 , $level = 0){

// 此处是重点

static $arrTree = [];

foreach($data as $k => $v){

if($v['parentId'] == $pid){

$v['level'] = $level;

// 使用静态,只会初始化一次,当遍历下一个分类时,保留上一次数据

$arrTree[]  = $v;

unset($k);

makeTreeTwo($data , $v['areaId'] , $level + 1);

}

}

return $arrTree;

}

方式三 全局变量方式实现/**

* 方式三 全局变量方式实现

*

* @param array   $data     二维数组,需要递归的数组数据

* @param integer $pid      父ID,默认顶级分类

* @param integer $level    层次

*

* @return array  $arrTree  返回值,排序好的二维数组

*/

$tree = [];

function makeTreeThree($data , $pid = 0 , $level = 0){

global $tree;

foreach($data as $k => $v){

if($v['parentId'] == $pid){

$v['level'] = $level;

$tree[]  = $v;

makeTreeThree($data , $v['areaId'] , $level + 1);

}

}

return $tree;

}

方式四 引用方式实现(一)/**

* 方式四 引用方式实现(一)

*

* @param array   $data     二维数组,需要递归的数组数据

* @param integer $pid      父ID,默认顶级分类

* @param integer $level    层次

*

* @return array  $arrTree  返回值,排序好的二维数组

*/

function makeTreeFour($data , $pid = 0 , $level = 0 , &$tree = []){

foreach($data as $v){

if($v['parentId'] == $pid){

$v['level'] = $level;

$tree[] = $v;

makeTreeFour($data , $v['areaId'] , $level + 1 , $tree);

}

}

return $tree;

}

方式五 引用方式实现(二)/**

* 方式五 引用方式实现(二)

*

* @param array   $data     二维数组,需要递归的数组数据

* @param integer $pid      父ID,默认顶级分类

* @param integer $level    层次

*

* @return array  $arrTree  返回值,多维数组

*/

function makeTreeFive($data , $pid = 0 , $level = 0){

// 存储构造好的数组数据

$indexArray = [];

foreach($data as $k => $v){

$indexArray[$v['areaId']] = $v;

}

// 存储递归整理的数组数据

$tree = [];

foreach($indexArray as $k => $v){

// 判断是否为上级分类

if($v['parentId'] == $pid){

// 顶级分类则将地址存放到数组tree中

$tree[] = &$indexArray[$k];

}else{

// 不是顶级分类,则将地址存放到父级分类的son节点中

$indexArray[$v['parentId']]['son'][] = &$indexArray[$k];

}

}

return $tree;

}

我是夕阳何处寻,期待和优秀的你一起同行!

夕阳何处寻

2020年03月26日

转载:感谢您对自如初博客网站的认可,所有文章均属原创文章,技术类文章转载请注明出处,“自如初博客”;文学类文章请带文本链接地址,否则视为侵权!

很赞哦!(8)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值