有层级关系的数据结构在表中最好带上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; }