简体   繁体   中英

Php Recursive function on array for tree view

I have following array:

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

keys of this array is unique, and values showing parent of key. like parent of 1 & 6 is 0, parent of 2 is 1, for 3 is 2....

I was writing a recursive function which will find a tree view for given parent id. here is my code:

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;
    }

The function I created give me result for depth of level one. result of this function if i call it for $parent=1 ($childParent is array given above) is:

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

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

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

)

I m expecting result like this:

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

                )
             [2] => 5
        )

or something that help me to create a tree view. Thank you in advance.

This does what you want:

<?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);

?>

model:

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;
}

}

view:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM