Php树视图数组的递归函数

时间:2013-07-11 11:57:37

标签: php codeigniter recursion

我有以下数组:

Array
(
    [1] => 0
    [2] => 1
    [3] => 2
    [4] => 3
    [5] => 1
    [6] => 0
)

此数组的键是唯一的,并且值显示键的父级。 喜欢1&的父母6为0,2的父为1,3为2 ....

我正在编写一个递归函数,它会找到给定父ID的树视图。 这是我的代码:

function recurviceChild($parent, $childParent, $resultArr = array()) {
        foreach ($childParent as $key => $parentId) {
            if ($parent == $parentId) {
                $resultArr[$parentId][] = $key;
                $resultArr = $this->recurviceChild($key, $childParent, $resultArr);
            }
        }
        return $resultArr;
    }

我创建的功能为我提供了第一级深度的结果。这个函数的结果,如果我为$ parent = 1调用它($ childParent是上面给出的数组)是:

Array
(
    [1] => Array
        (
            [0] => 2
            [1] => 5
        )

    [2] => Array
        (
            [0] => 3
        )

    [3] => Array
        (
            [0] => 4
        )

)

我期待这样的结果:

 Array
        (
            [1] => Array
                (
                    [2] => Array
                       (
                           [3] => Array
                                (
                                   [0] => 4
                                )
                       )

                )
             [2] => 5
        )

或帮助我创建树视图的东西。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

这样做你想要的:

<?php

$a= array
(
    1 => 0,
    2 => 1,
    3 => 2,
    4 => 3,
    5 => 1,
    6 => 0
);

class node {
    var $children;
    public function __construct(){
        $this->children = array();
    }
}

$tree = array();
foreach ($a as $q => $p){
    if(!isset($tree[$p]))
        $tree[$p] = new node;
    if(!isset($tree[$q]))
        $tree[$q] = new node;
    $mark[$p]=FALSE;
    $mark[$q]=FALSE;
    array_push($tree[$p]->children,$q);
}

function dfs(&$ans,$node){
    global $tree, $mark;
    $mark[$node] = TRUE;
    $ans = array();
    foreach($tree[$node]->children as $child)
        if(!$mark[$child]){
            $ans[$child]=$child;
            dfs($ans[$child],$child);
        }
}

$parent=1;

dfs($ans,$parent);

print_r($ans);

?>

答案 1 :(得分:1)

模型:

class Menu extends CI_Model {

public function __construct() {
    parent::__construct();

}

public function menu_array($parent = 0) {
    $items = array();

    $this->db->where('parent', $parent);
    $results = $this->db->get('os_menu')->result();

    foreach($results as $result) {
        $child_array = $this->menu_array($result->id);
        if(sizeof($child_array) == 0) {
            array_push($items, $result);
        } else {
            array_push($items, array($result, $child_array));
        }
    }
    return $items;
}

public function show_menu_array($array){
    $output = '<ul>';
    foreach ($array as $key => $mixedValue) {
        if (is_array($mixedValue)) {
            $output .= '<li>' . $this->show_menu_array($mixedValue) . '</li>';
        } else {
            $output .= '<li>' . $mixedValue->name . '</li>';
        }
    }
    $output .= '</ul>';
    return $output;
}

}

视图:

$menu = new Menu();
$menu_array = $menu->menu_array();
echo $menu->show_menu_array($menu_array);