我有这样的数据。
Array
(
[0] => stdClass Object
(
[tid] => 1
[t_name] => A
[t_level] => 1
[children] => Array
(
[0] => stdClass Object
(
[tid] => 5
[t_name] => A.1
[t_level] => 2
)
[1] => stdClass Object
(
[tid] => 6
[t_name] => A.2
[t_level] => 2
[children] => Array
(
[0] => stdClass Object
(
[tid] => 7
[t_name] => A.2.1
[t_level] => 3
[children] => Array
(
[0] => stdClass Object
(
[tid] => 9
[t_name] => A.2.1.1
[t_level] => 4
[array_val] => Array
(
[0] => 0
[1] => 1
[2] => 2
)
[obj_val] => stdClass Object
(
)
)
[1] => stdClass Object
(
[tid] => 10
[t_name] => A.2.1.2
[t_level] => 4
)
)
)
[1] => stdClass Object
(
[tid] => 8
[t_name] => A.2.2
[t_level] => 3
)
)
)
)
)
[1] => stdClass Object
(
[tid] => 2
[t_name] => B
[t_level] => 1
)
[2] => stdClass Object
(
[tid] => 3
[t_name] => C
[t_level] => 1
)
[3] => stdClass Object
(
[tid] => 4
[t_name] => D
[t_level] => 1
)
)
原始数据转换为JSON:
[{"tid":1,"t_name":"A","t_level":1,"children":[{"tid":5,"t_name":"A.1","t_level":2},{"tid":6,"t_name":"A.2","t_level":2,"children":[{"tid":7,"t_name":"A.2.1","t_level":3,"children":[{"tid":9,"t_name":"A.2.1.1","t_level":4,"array_val":[0,1,2],"obj_val":{}},{"tid":10,"t_name":"A.2.1.2","t_level":4}]},{"tid":8,"t_name":"A.2.2","t_level":3}]}]},{"tid":2,"t_name":"B","t_level":1},{"tid":3,"t_name":"C","t_level":1},{"tid":4,"t_name":"D","t_level":1}]
它是 4 级深度,我想将所有深度超过 2 的子级拉到 2 级的父级列表中。
Array
(
[0] => stdClass Object
(
[tid] => 1
[t_name] => A
[t_level] => 1
[children] => Array
(
[0] => stdClass Object
(
[tid] => 5
[t_name] => A.1
[t_level] => 2
)
[1] => stdClass Object
(
[tid] => 6
[t_name] => A.2
[t_level] => 2
)
[2] => stdClass Object
(
[tid] => 7
[t_name] => A.2.1
[t_level] => 2
)
[3] => stdClass Object
(
[tid] => 9
[t_name] => A.2.1.1
[t_level] => 2
[array_val] => Array
(
[0] => 0
[1] => 1
[2] => 2
)
[obj_val] => stdClass Object
(
)
)
[4] => stdClass Object
(
[tid] => 10
[t_name] => A.2.1.2
[t_level] => 2
)
[5] => stdClass Object
(
[tid] => 8
[t_name] => A.2.2
[t_level] => 2
)
)
)
[1] => stdClass Object
(
[tid] => 2
[t_name] => B
[t_level] => 1
)
[2] => stdClass Object
(
[tid] => 3
[t_name] => C
[t_level] => 1
)
[3] => stdClass Object
(
[tid] => 4
[t_name] => D
[t_level] => 1
)
)
JSON 中的预期结果:
[{"tid":1,"t_name":"A","t_level":1,"children":[{"tid":5,"t_name":"A.1","t_level":2},{"tid":6,"t_name":"A.2","t_level":2},{"tid":7,"t_name":"A.2.1","t_level":2},{"tid":9,"t_name":"A.2.1.1","t_level":2,"array_val":[0,1,2],"obj_val":{}},{"tid":10,"t_name":"A.2.1.2","t_level":2},{"tid":8,"t_name":"A.2.2","t_level":2}]},{"tid":2,"t_name":"B","t_level":1},{"tid":3,"t_name":"C","t_level":1},{"tid":4,"t_name":"D","t_level":1}]
这是我尝试过的,但我不知道如何将它们移至父级。似乎没有函数/方法来设置父值或附加到父列表。
$maxDepth = 2;// max depth allowed.
$RAI = new \RecursiveArrayIterator($array);
$RII = new \RecursiveIteratorIterator($RAI, \RecursiveIteratorIterator::SELF_FIRST);
$RII->setMaxDepth($maxDepth);
foreach ($RII as $key => $value) {
if ($key === 't_level' && intval($value) > $maxDepth) {
// what to do? can't move them to their parent.
}
}// endforeach;
unset($key, $value);
$array = $RII->getArrayCopy();
// see result.
print_r($array);
我建议创建一个执行深度优先遍历的递归函数,它依赖于
$depth
参数来选择是使用递归结果数组来扩展展平数组,还是保留嵌套结构。
代码:
function flattenAtDepth($array, $depth) {
$result = [];
foreach ($array as $obj) {
$rest = [];
if (isset($obj->children)) {
$obj = clone $obj;
$children = flattenAtDepth($obj->children, $depth-1);
if ($depth <= 1) {
unset($obj->children);
$rest = $children;
} else {
$obj->children = $children;
}
}
array_push($result, $obj, ...$rest);
}
return $result;
}
致电:
$result = flattenAtDepth($array, $maxDepth);