最近在业务上遇到一个需求,需要根据已知的一个数一层一层查找除所有对应下级用户,然后将结果放在数组中。
最后返回的结果大概是这样:
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" => [] ] ] ], ] ] ];
|
这个问题的难点在于:
- 我并不知道有多少个下级
- 索引是未知的。
对于这个问题,首先第一个想到是使用递归算法来解决。
使用递归算法是没错,不过思路还是有些问题,我试图通过正向查找,然后将数据 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; }
|
不得不说递归算法真的非常优雅,仅仅不到十来行代码就把这个复杂的问题给解决了。