PHP数组转树形结构,获取任意子节点的全部父节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
 * 递归无限级分类,获取任意节点下所有子孩子
 * @param array $arr
 * @param int|string $pid 父级节点
 * @param string $p_name 父级节点名称
 * @param int $level 层级数
 * @return array
 */
function get_tree_all_children(array $arr, int|string $pid = 0, string $p_name = 'pid', int $level = 0): array
{
    $data = array();
    foreach ($arr as $k => $v) {
        if ($v[$p_name] == $pid) {
            $arr[$k]['level'] = $level;
            $data[]           = $arr[$k];
            $data             = array_merge($data, get_tree_all_children($arr, $v['id'], $p_name, $level + 1));
        }
    }
    return $data;
}
 
/**
 * 递归无限级分类,获取任意节点的所有父级
 * @param array $arr 数据
 * @param int|string $id 节点
 * @param string $p_name 父级节点名称
 * @param int $level 层级数
 * @return array
 */
function get_tree_all_parent(array $arr, int|string $id = 0, string $p_name = 'pid', int $level = 0): array
{
    $data = array();
    foreach ($arr as $k => $v) {
        if ((int)$id === (int)$v['id']) {
            $arr[$k]['level'] = $level;
            $data[]           = $arr[$k];
            $data             = array_merge($data, get_tree_all_parent($arr, (int)$v[$p_name], $p_name, $level - 1));
        }
    }
    $last_names = array_column($data, 'level');
    array_multisort($last_names, SORT_ASC, $data);
    return $data;
}

  

posted @   橙子与柠檬  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示