php 循环 递归,简单 用循环代替递归 的 php 无限级分类处理

//要处理的数组

$arr = array(

array('id'=>1,'name'=>'分类1','pid'=>0),

array('id'=>2,'name'=>'分类2','pid'=>0),

array('id'=>3,'name'=>'分类3','pid'=>1),

array('id'=>4,'name'=>'分类4','pid'=>3),

array('id'=>5,'name'=>'分类5','pid'=>4),

array('id'=>6,'name'=>'分类6','pid'=>2),

array('id'=>7,'name'=>'分类7','pid'=>6),

array('id'=>8,'name'=>'分类8','pid'=>5),

array('id'=>9,'name'=>'分类9','pid'=>8),

);

echo getCatelujin(9);

/*

* @参数$id 当前分类ID

* @参数$depth 深度 0 则不考虑 一直寻找到最高 大于0说明深度是受限的

*/

function getCatelujin($id ,$depth = 0){

global $arr;

$str = ''; $id = (int)$id; $i = 0; $depth = (int)$depth;

while(true){

if($depth && $i >= $depth) break; //超过深度 跳出循环 避免死循环

if($id == 0) break; //但ID被替换后的值为0 说明是顶级了

$is_right = true;//限定条件 是否在数组内

foreach($arr as $k=>$v){//循环数组

$is_right = false;

if($v['id'] == $id){//条件

$is_right = true;

if(empty($str)){

$str = $v['name'];

}else{

$str = $v['name'] . ' > '.$str;//行程路径

}

$id = (int)$v['pid']; //重新赋值ID 进行循环下一个条件

unset($arr[$k]);//将取到的数据从数组中剔除

break;

}

}

if(!$is_right) break;

++$i;

}

return $str;

}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现无限分类的方法有多种,其中包括递归和非递归两种方式。下面分别介绍一下这两种方法的实现。 1. 递归实现无限分类 递归实现无限分类的方法是将分类数据作为一个树形结构来处理。具体实现步骤如下: (1)从数据库中获取所有分类数据,并按照父子关系组织为树形结构。 (2)遍历树形结构,输出每个分类的名称以及子分类的名称。 (3)对于每个子分类,重复步骤(2)。 下面是一个递归实现无限分类的示例代码: ```php function getCategoryTree($parent_id = 0, $level = 0) { $categories = getCategoryByParentId($parent_id); if (count($categories) > 0) { foreach ($categories as $category) { echo str_repeat('-', $level) . $category['name'] . '<br>'; getCategoryTree($category['id'], $level + 1); } } } function getCategoryByParentId($parent_id) { // 从数据库中获取 $parent_id 的所有子分类数据 // ... return $categories; } // 输出所有分类 getCategoryTree(); ``` 2. 非递归实现无限分类递归实现无限分类的方法是使用堆栈(或队列)来处理分类数据。具体实现步骤如下: (1)从数据库中获取所有分类数据,并按照父子关系组织为一个数组。 (2)将根分类(即 parent_id 为 0 的分类)入栈。 (3)从堆栈中取出一个分类,并输出该分类的名称。 (4)将该分类的所有子分类依次入栈。 (5)重复步骤(3)和(4),直到堆栈为空。 下面是一个非递归实现无限分类的示例代码: ```php function getCategoryTree() { $categories = getCategoryByParentId(0); $stack = array(); foreach ($categories as $category) { array_push($stack, array('category' => $category, 'level' => 0)); } while (count($stack) > 0) { $current = array_pop($stack); echo str_repeat('-', $current['level']) . $current['category']['name'] . '<br>'; $children = getCategoryByParentId($current['category']['id']); foreach ($children as $child) { array_push($stack, array('category' => $child, 'level' => $current['level'] + 1)); } } } function getCategoryByParentId($parent_id) { // 从数据库中获取 $parent_id 的所有子分类数据 // ... return $categories; } // 输出所有分类 getCategoryTree(); ``` 以上就是php实现无限分类的两种方法。从实现难度和效率上来看,递归方法更简单,但对于数据量较大的情况,可能会导致栈溢出。非递归方法虽然复杂一些,但可以处理更大的数据量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值