笔记:常用的树结构递归
每次到了一个“新的环境”,几乎都会遇到类似树结构的数据设计。就会苦逼的写着“几年前就写过的代码”时,不由的会感慨笔记真是个好东西。
<?php
namespace App\Service\Traits;
trait TreeTrait
{
/**
* @param $selfVal | 自己的值
* @param $selfKey | 自己的健
* @param $list | 元数据
* @param $pKey | 上级关联Key
* @param array $parentArr 用与保存的上级数组
* @return array
*/
public function parent($selfVal, $selfKey, $list, $pKey, $parentArr = [])
{
if (is_array($list)) {
foreach ($list as $key => $val) {
if ($val[$pKey] === $selfVal) {
array_push($parentArr, $val[$selfKey]);
$parentArr = self::parent($val[$selfKey], $selfKey, $list, $pKey, $parentArr);
}
}
}
return $parentArr;
}
/**
* 树结构数据
* @param $selfList | 需要查找下级的数据 二维
* @param $selfKey | 关联自己的key | id
* @param $list | 全数据
* @param $cKey | 关联下级的key | pid
* @param int $maxLevel | 终止最大深度
* @param int $offset | 所在位置
* @return array
*/
public function child($selfList, $selfKey, $list, $cKey, $maxLevel = 255, $offset = 0)
{
$maxLevel--;
$offset++;
if (!$selfList) {
return [];
}
foreach ($selfList as $key => $val) {
$selfList[$key]['offset'] = $offset;
$childArr = [];
foreach ($list as $k => $v) {
if ($v[$cKey] === $val[$selfKey]) {
array_push($childArr, $v);
}
}
//递归
if ($childArr) {
if ($maxLevel > 0) {
$child = self::child($childArr, $selfKey, $list, $cKey, $maxLevel, $offset);
$selfList[$key]['child'] = $child;
}
}
}
return $selfList;
}
/**
* 查找自己下级的 id
* @param $selfVal | 当前 id
* @param $selfKey | id
* @param $list | 全数据
* @param $cKey | 下级关联的key | pid
* @param array $childArr | 存储下级id数组
* @return array
*/
public function childId($selfVal, $selfKey, $list, $cKey, $childArr = [])
{
foreach ($list as $key => $val) {
if ($val[$cKey] === $selfVal) {
array_push($childArr, $val[$selfKey]);
$childArr = self::childId($val[$selfKey], $selfKey, $list, $cKey, $childArr);
}
}
return $childArr;
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接