有层级关系的数据结构在表中最好带上level字段,空间换性能,不然在编辑数据的时候容易出现异常 瞬间记录几个函数
/**
* 二维数组根据字段进行排序
* [@params](https://my.oschina.net/params) array $array 需要排序的数组
* [@params](https://my.oschina.net/params) string $field 排序的字段
* [@params](https://my.oschina.net/params) string $sort 排序顺序标志 SORT_DESC 降序;SORT_ASC 升序
*/
protected function arraySequence($array, $field, $sort = 'SORT_ASC')
{
$arrSort = array();
foreach ($array as $uniqid => $row) {
foreach ($row as $key => $value) {
$arrSort[$key][$uniqid] = $value;
}
}
array_multisort($arrSort[$field], constant($sort), $array);
return $array;
}
/**
* 判断parent_id的父辈元素中是否含有id元素是否为查找元素的父元素 -- find_key正向排序性能更好
*/
protected function find_parent(array $data,int $parent_id,int $id,string $find_key)
{
if($parent_id == $id) {
return true;
}
$sort = function($data,$parent_id) use ($find_key,$id,&$sort) {
if($parent_id == $id) {
return true;
}
if($parent_id == 0) {
return false;
}
foreach($data as $v) {
if($v[$find_key] == $parent_id) {
return $sort($data,$v['parent_id']);
}
}
return false;
};
return $sort($data,$parent_id);
}
/**
* 通过parent_id查找子孙数组(包含自己)
* [@param](https://my.oschina.net/u/2303379) array $data
* [@param](https://my.oschina.net/u/2303379) int $parent_id
* @param string $find_key
* @return array $res
*/
protected function get_son_array(array $data,int $parent_id,string $find_key = 'id'):array
{
//对data进行排序
if($data == []) {
return [];
}
$data = $this->arraySequence($data,$find_key);
$find = [];
$res = [];
foreach($data as $v) {
if( $v[$find_key] == $parent_id || in_array($v['parent_id'],$find)) {
$res[] = $v;
$find[] = $v[$find_key];
}
}
$res = $this->get_tree_by_parent_id($res);
return $res;
}
/**
* 根据parent_id获取树状二维数组
* @param array $data
* @return array $res
*/
protected function get_tree_by_parent_id(array $data):array
{
$res = [];
$sort = function ($data , $parent_id = 0, $level = 0) use (&$res,&$sort) {
foreach($data as $k => $v) {
if($v['parent_id'] == $parent_id) {
$v['level'] = $level;
$res[] = $v;
unset($data[$k]);
$sort($data,$v['id'],$level+1);
}
}
};
$sort($data);
return $res;
}