另一个递归问题。
我过去几个小时试图开发的功能是让我生成相同页面的平面数组,但是孩子们面前有一个标识符,(“ - Sub Page, - - Sub Sub Page等“)。
我有一个分层的页面数组,每个子页面嵌套在其父页面中。这是他们输出的一个例子:
Array
(
[0] => Array
(
[id] => 1
[parent_id] => 0
[title] => Parent Page
[children] => Array
(
[0] => Array
(
[id] => 12
[parent_id] => 1
[title] => Another Sub Page
)
[1] => Array
(
[id] => 3
[parent_id] => 1
[title] => Sub Page
[children] => Array
(
[0] => Array
(
[id] => 7
[parent_id] => 3
[title] => Sub Sub Page
)
)
)
)
)
[1] => Array
(
[id] => 8
[parent_id] => 0
[title] => Another Parent Page
)
)
我已经能够使它工作,直到我达到递归的第二级,然后它仍然只生成一个—
。我想让解决方案递归。
使用上面的例子,我在最终输出中寻找的是:
Array
(
[1] => Parent Page
[12] => — Another Sub Page
[3] => — Sub Page
[7] => — — Sub Sub Page
[8] => Another Parent Page
)
答案 0 :(得分:2)
function generate_array(array $arr, &$output = array(), $index = 0)
{
foreach($arr as $item)
{
$output[$item['id']] = str_repeat('— ', $index) . $item['title'];
if(isset($item['children']))
{
generate_array($item['children'], $output, $index + 1);
}
}
return $output;
}
$output = generate_array($arr);
$output
中存储的数据为:
Array
(
[1] => Parent Page
[12] => — Another Sub Page
[3] => — Sub Page
[7] => — — Sub Sub Page
[8] => Another Parent Page
)
答案 1 :(得分:2)
<?php
$output = array();
$iter = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
foreach ($iter as $key => $val) {
if ($key === 'title') {
$output[] = str_repeat('—', floor($iter->getDepth()/2)) . $val;
}
}
print_r($output);
您也可以进行迭代
$stack = $output = array();
$stack[] = array(0, $array);
while ($stack) {
list($depth, $nodes) = array_pop($stack);
foreach ($nodes as $node) {
if (isset($node['children'])) {
$stack[] = array($depth + 1, $node['children']);
}
$output[] = str_repeat('—', $depth) . $node['title'];
}
}
print_r($output);
值得一提的是,尽管名称不同,但RecursiveIterator实际上并没有在内部使用递归。他们管理类似于我的第二个例子的堆栈。
答案 2 :(得分:1)
我使用了这样的示例数组:
$array = array(
array(
'title' => 'Test',
'children' => array(
array(
'title' => 'test child',
'children' => array(
array(
'title' => 'yo dawg, i heard you like recursion!'
)
)
)
)
),
array(
'title' => 'Test 2',
'children' => array()
)
);
,功能如下:
function flatIt($array, $depth = 0, &$flat = array())
{
foreach ($array as $item) {
$flat[] = array('title' => str_repeat('—', $depth) . $item['title']);
if (!empty ($item['children'])) {
flatIt($item['children'], $depth + 1, $flat);
}
}
return $flat;
}
当你调用这样的函数时:
$result = flatIt($array);
var_dump($result);
您将获得以下结果:
array
0 =>
array
'title' => string 'Test' (length=4)
1 =>
array
'title' => string '—test child' (length=17)
2 =>
array
'title' => string '——yo dawg, i heard you like recursion!' (length=50)
3 =>
array
'title' => string 'Test 2' (length=6)