小艾的自留地

Stay foolish, Stay hungry

最近在业务上遇到一个需求,需要根据已知的一个数一层一层查找除所有对应下级用户,然后将结果放在数组中。

最后返回的结果大概是这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$result = [
0 => [
"user_id" => "php",
"sub_id" => [
0 => [
"user_id" => "python",
"sub_id" => []
],
1 => [
"user_id" => "go",
"sup_id" => [
0 => [
"user_id" => "ruby",
"sub_id" => []
]
]
],
]
]
];

这个问题的难点在于:

  1. 我并不知道有多少个下级
  2. 索引是未知的。

对于这个问题,首先第一个想到是使用递归算法来解决。

使用递归算法是没错,不过思路还是有些问题,我试图通过正向查找,然后将数据 push 至结果集。
所以这里存在一个问题:我需要知道数组具体的索引是多少。

在第一个思路无解之后,果断放弃了。
要解决这个问题,我得正向查找,逆向存值。

也就是把递归返回的结果压入到当前用户的数组中,然后返回当前用户,从最后一个用户往前处理。

最后实现的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
function get_user_tree($user_id){
$result = [];

// todo(数据查询)

// 遍历数据
foreach ($data as $item){
$user = get_user_tree($item['user_id']);
$item['sub_id'] = $user;
array_push($result, $item);
}
return $result;
}

不得不说递归算法真的非常优雅,仅仅不到十来行代码就把这个复杂的问题给解决了。

评论