相同字段嵌套的多维数组遍历递归实现

相同字段嵌套的多维数组遍历递归实现

JSON示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// json中的嵌套层数大概在1-8层之间
$graph = {
'name': 'a',
'value': '123'
'children': {
'0': {
'name': 'a',
'value': '123',
'children': {
'0': {
'name': 'a',
'value': '123',
},
...
}
},
...
}
},
...

需求分析

信息引爆点分析 截取JSON中以value排序的top20
[其中子数组的截取无需排序]
通过name批量请求接口转换对应的内容 填充原数据源[JSON]

考虑性能方面 优先采用php自带的函数

转换Array

1
2
<?php
$arr = json_decode($graph, true);

取以value排序的top20

usort(array,myfunction)

usort() 函数使用用户自定义的函数对数组排序
1
2
3
4
5
<?php
function mySort($a, $b){
return $a['value']==$b['value']?0:($a['value']<$b['value']?1:-1);
}
usort($arr['children'], 'mySort');

array_slice(array,start,length,preserve)

array_slice() 函数在数组中根据条件取出一段值 并返回
1
2
3
4
5
6
7
<?php
$children = array_slice($arr['children'],0, 20);
foreach($children as &$key){
if(array_key_exists('children', $key)){
$key['children'] = array_slice($key['children'],0, 20);
}
}

递归获取value字段值的数组

1
2
3
4
5
6
7
8
9
10
11
<?php
# map值初始传递空数组
function recursion_get_mid($arr, $map){
foreach($arr as $key){
if(array_key_exists('children', $key)){
$map = array_merge(recursion_get_mid($key['children'], $map));
}
array_push($map, $key['name']);
}
return $map;
}

递归更新JSON源

当从接口中获取不到name对应的信息 丢弃该信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
# 请求接口的细节已忽略
# new为一个散列表 即key对应了原本的value字段的值
function recursion_update_child($arr, $new){
foreach($arr as $key => &$value){
if(!array_key_exists($value['name'], $new)){
# 接口不存在该name对应的信息的情况
# 不想破坏原有索引 使用下面的方式
$value = [];
# 需要丢弃数据 不再维护完整索引
# unset($arr[$key]);
continue;
}
# 添加信息源
$value['xxx'] = $new[$value['name']]['xxx'];
# ...
if(array_key_exists('children', $value)){
# 存在子数组 递归
$value['children'] = recursion_update_child($value['children'], $new);
}
}
return $arr;
}

转换JSON

1
2
<?php
return json_encode($arr, true);

可能用的函数

array_column(array,column_key,index_key)

array_column() 返回输入数组中某个单一列的值

###

假设我们要构建一个散列表

将下列JSON转换成以value字段的值作为key的JSON

1
2
3
4
5
6
7
8
9
10
11
$json = {
{
'name': '12',
'value': 'sdw',
},
{
'name': '1',
'value': 'as',
},
...
};

只需要

1
2
<?php
return json_encode(array_column(json_decode($json, true), NULL, 'value'), true);

最后

这个需求自身的层数不会太深 大概在1-8层
所以暂未考虑 递归太深 导致堆栈溢出的解决 解决堆栈溢出 可以将递归改为循环遍历操作
或者当递归层数大于某层时 退出即可

如果您有更好的方法
欢迎留言🥳

# PHP

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×