如何将树状数组转换为二维线性数组?现在我仍然被这个问题困住了。也许有人会问这个问题,但我不知道如何回答。
$str='[{"id":1},{"id":2,"children":[{"id":3,"children":[{"id":4}]},{"id":5,"children":[{"id":6},{"id":7,"children":[{"id":8}]}]},{"id":9},{"id":10}]},{"id":11,"children":[{"id":12}]}]'
当我使用json_decode()函数将其转换为数组时,这是我的json字符串。我得到了以下结果
Array
(
[0] => stdClass Object
(
[id] => 1
)
[1] => stdClass Object
(
[id] => 2
[children] => Array
(
[0] => stdClass Object
(
[id] => 3
[children] => Array
(
[0] => stdClass Object
(
[id] => 4
)
)
)
[1] => stdClass Object
(
[id] => 5
[children] => Array
(
[0] => stdClass Object
(
[id] => 6
)
)
)
[2] => stdClass Object
(
[id] => 7
)
[3] => stdClass Object
(
[id] => 8
)
)
)
[2] => stdClass Object
(
[id] => 9
[children] => Array
(
[0] => stdClass Object
(
[id] => 10
)
)
)
)
这是一个树形结构但我需要把它转换成一个二维数组,比如
Array
(
[0] => Array
(
[parent] => 0
[id] => 1
)
[1] => Array
(
[parent] => 0
[id] => 2
)
[2] => Array
(
[parent] => 2
[id] => 3
)
[3] => Array
(
[parent] => 3
[id] => 4
)
[4] => Array
(
[parent] => 2
[id] => 5
)
[5] => Array
(
[parent] => 5
[id] => 6
)
[6] => Array
(
[parent] => 2
[id] => 7
)
[7] => Array
(
[parent] => 2
[id] => 8
)
[8] => Array
(
[parent] => 0
[id] => 9
)
[9] => Array
(
[parent] => 0
[id] => 10
)
)
您需要编写一个递归函数和/或循环来将您的对象排序到您指定的数组中。
我首先要说的是,在未来,如果你能发布样本数据和预期输出,实际上匹配你想要的和期望的,那将是伟大的-因为我刚刚花了十分钟的工作,为什么我的函数告诉我id 7的父是id 5,而你的例子说它应该是2,当你的JSON和你的示例数组实际上是不同的-讨厌。
无论如何,这是一个想法:
- 递归函数,用于检查传入数组中的子元素。如果存在,则对其子函数再次调用该函数。无论是否存在子数组,都将当前值添加到输出数组中。
-
&$output
=通过引用传递的输出变量,因此您不需要返回任何内容,并且无需全局调用即可访问输出变量。 -
$parent_id
表示每次遍历子节点时的父节点id。在第一种情况下,节点没有父节点,声明$parent_id = 0
将定义您的"默认"父节点ID。
function checkForChildrenOtherwiseAddToArray(&$output, $array, $parent_id = 0) {
// loop through all sub-arrays inside this instance (if any)
foreach($array as $each) {
// check for children
if(isset($each->children)) {
// go deeper, passing in children and parent ID
checkForChildrenOtherwiseAddToArray($output, $each->children, $each->id);
}
// add current iteration to array as well
$output[] = array(
'parent' => $parent_id,
'id' => $each->id
);
}
}
使用例子:
$your_array = json_decode($str);
$output = array();
checkForChildrenOtherwiseAddToArray($output, $your_array);
由于该函数的递归性质,这将给您提供看似无序的结果。例如,要按id排序,您可以使用usort()
:
usort($output, function($a, $b) {
return $a['id'] - $b['id'];
});
…您的示例输出将是:
Array
(
[0] => Array
(
[parent] => 0
[id] => 1
)
[1] => Array
(
[parent] => 0
[id] => 2
)
[2] => Array
(
[parent] => 2
[id] => 3
)
[3] => Array
(
[parent] => 3
[id] => 4
)
[4] => Array
(
[parent] => 2
[id] => 5
)
[5] => Array
(
[parent] => 5
[id] => 6
)
[6] => Array
(
[parent] => 5
[id] => 7
)
[7] => Array
(
[parent] => 7
[id] => 8
)
[8] => Array
(
[parent] => 2
[id] => 9
)
[9] => Array
(
[parent] => 2
[id] => 10
)
[10] => Array
(
[parent] => 0
[id] => 11
)
[11] => Array
(
[parent] => 11
[id] => 12
)
)