问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求助,php递归里面使用静态变量保存数组,怎么处理成树形结构?

发布网友 发布时间:2022-04-24 17:16

我来回答

2个回答

懂视网 时间:2022-04-28 10:58

关于组合模式,千万不要从字面理解,它和我们理解的组合关系没什么关系,它是用来处理树状结构的数据。因为它只能处理树形结构的数据,所以在日常中并不是很常用,但如果满足了树形结构,使用该模式就能非常好的处理,能够大大减少代码量,写出的代码简洁明了。

定义

组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。它的核心就在于递归,通过递归来依次处理树形结构数据。

场景

文件目录树就是一个典型的树形结构的数据。下面展示一个用于计算文件或目录大小的功能的类,主要有两个方法,添加子节点(子树)addNode,统计文件或目录大小fileSize。

class File
{
 private $path = '';
 private $nodes = [];
 private $fileSize = 0;
 
 public function __construct(string $path, int $fileSize)
 {
 $this->path = $path;
 $this->fileSize = $fileSize;
 }
 
 public function addNode (File $node)
 {
 $this->nodes[] = $node;
 }
 
 public function fileSize ()
 {
 $size = 0;
 foreach ($this->nodes as $node) {
  $size += $node->fileSize();
 }
 return $size;
 }
}

下面模拟出以下的目录树

/app

/app/1.txt
/app/a
/app/b

/app/a/a1.txt
/app/b/b1.txt
/app/b/b2.txt

测试代码如下:

$node0 = new File('/app', 0);

$node1 = new File('/app/1.txt', 1000);
$node2 = new File('/app/a', 0);
$node3 = new File('/app/b', 0);

$node21 = new File('/app/a1.txt', 1000);
$node31 = new File('/app/b1.txt', 1000);
$node32 = new File('/app/b2.txt', 1000);

$node2->addNode($node21);
$node3->addNode($node31);
$node3->addNode($node32);
$node0->addNode($node1);
$node0->addNode($node2);
$node0->addNode($node3);

// 计算目录/app/b大小
echo $node3->fileSize() . 'B' . PHP_EOL; // 2000
// 计算/app目录大小
echo $node0->fileSize() . 'B' . PHP_EOL; // 4000

总结

组合模式,将一组对象组织成树形的结构,然后将对象看做是树的节点。利用树形的数据结构,使用递归来处理每个子树,依次来简化代码实现。因为该模式对于数据有严格的要求,所以在日常中用到的并不多。如想使用该模式,需要你对业务场景非常的了解,然后能把数据抽象成树形结构。一般我们常见的有,文件的目录树、无限极分类的处理等等。

热心网友 时间:2022-04-28 08:06

$arr = [
['cid'=>1,'name'=>1,'pid'=>0],
['cid'=>2,'name'=>2,'pid'=>1],
['cid'=>3,'name'=>3,'pid'=>2],
['cid'=>4,'name'=>4,'pid'=>0],
['cid'=>5,'name'=>5,'pid'=>4],
['cid'=>6,'name'=>6,'pid'=>4],
['cid'=>7,'name'=>7,'pid'=>5],
['cid'=>8,'name'=>8,'pid'=>5],
];

$re = GetTree($arr);
print_r($re);

function GetTree($arr,$pid = 0,&$re = []){
foreach($arr as $key=>$val) {
if($val['pid'] == $pid) {
$val['sub'] = GetTree($arr , $val['cid']);
$re[] = $val;
}
}
return $re;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
请懂八字命盘的给我看下这属于什么命。谢谢各位大师了。 请问懂八字的大师给我解释下:忧伤妻子,通火气月,行身旺运是什么意思呢... 怎么样看萨摩耶纯不纯? 第一次养了一条呆萌的萨摩耶,是什么体验? 如何察看纯种萨摩耶 初来乍到 - 都柏林 微信删除好友后对方为什么还可以在评论? ...高人们:那五十音图是相当于汉语的拼音还是汉字? 谢谢 归纳总结五脏六腑之间的关系 港澳通行证过期了怎么办 重庆港澳通行证换证材料 如何将数据库中数据转化成树形结构 求一个二维数组转结构树的高效算法,C# 急急急!!!怎样将json数组数据 转成json树结构数据? 怎么将数据库中存的树转化为树形列表 怎样把一个数组转化成二叉树? 数组集合如何转换成树形 五年级小数除法口算题 五年级小数除法试卷 给女生送什么礼物? 小学五年级小数乘除法口算1000题 权志龙是唯一有的人 但是到底是什么意思 女生送给女生该送什么花? 五年级小数乘、除法计算题、应用题各20道。 五年级小数乘除法笔算题 权志龙是唯一有的人 但是到底是什么意思 送女生什么礼物好,要有意义的。 五年级口算题(小数乘除法) 杜松子酒怎么做的?它有什么功效? 请给80道带答案的五年级乘除法小数口算题,我急用! 酒吧什么酒好喝 js中如何将json数组转换为tree结构对象 grasshopper怎么把列表数据转化为树形数据 如何用Java实现树形结构啊? 清明节主题班会~急~啊 请教如何将php数组以树形结构输出到页面 如何搞一个有关清明节的主题班会~我要详细的策划~! C# 怎么讲数据库字段转换为树状结构(treeview)呢? 清明节有什么活动? php输出数组为树形结构,处理末端子目录出现问题,求教~ 数据结构,树形结构问题。 2021深圳清明节有哪些免费活动 深圳清明节活动盘点 求反转PHP数组树形结构 怎么把Json数据转成Json树状结构 数据结构怎么又分为集合,线性结构,树形结构,图状结构,然后又分为逻辑结构,储存结构,对数据的操作? java实现对树形结构(文件夹式)数据数组进行排序 Matlab 如何实现树结构 2020年云南省临沧市事业单位招聘条件是什么? 临沧事业单位招聘2020岗位表可以在哪里查看? 临沧市2020年事业单位招聘特殊教育社会工作岗位到现在有多少人报名了? 临沧2020事业单位考试人数会有2019年的多吗?