递归函数从分层数组生成平面(但带有标题嵌套)数组

时间:2011-12-22 22:51:22

标签: php recursion

另一个递归问题。

我过去几个小时试图开发的功能是让我生成相同页面的平面数组,但是孩子们面前有一个标识符,(“ - 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
)

3 个答案:

答案 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('&mdash;', 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('&mdash;', $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('&mdash;', $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 '&mdash;test child' (length=17)
  2 => 
    array
      'title' => string '&mdash;&mdash;yo dawg, i heard you like recursion!' (length=50)
  3 => 
    array
      'title' => string 'Test 2' (length=6)