многомерное меню на php

By | May 14, 2015

Получая из базы многомерный массив для отображения в меню обычно стоит задача обработать его и получить массив для дальнейшей обработке во вьюшке.

Я не стал описывать интерфейс класса, т.к. и так понятно что и как, для опытных программистов.

 

<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

/*
 * Second test task
 * @autor Glazyrev Konstantin
 * */
class Tree {

    /*
     * input array
     * */
    public $arr_tree = array();

    /*
     * output array
     */
    public $a = array();
    public function __construct() {
        $this -> arr_tree = array( 
                    array('node_id' => 1, 'parent_id' => NULL, 'title' => 'Node 1'), 
                    array('node_id' => 2, 'parent_id' => '1', 'title' => 'Node 2'), 
                    array('node_id' => 3, 'parent_id' => '2', 'title' => 'Node 3'), 
                    array('node_id' => 4, 'parent_id' => '2', 'title' => 'Node 4'), 
                    array('node_id' => 5, 'parent_id' => NULL, 'title' => 'Node 5'), 
        );
    }

    public function building_tree() {
        // node_id parent_id title

        if ($this -> arr_tree['0'])
            return $this -> build($this -> arr_tree);

    }

    /**
     * @param array $arr - array of data to send to the method
     * @param array $node_array - array of data to send to the method of repetition menu
     * @param  int|bool $parent_id $parent_id - value parent id
     * @param  int $node_id value parent
     * @param  int|bool $parent_id $parent_id - key parent id
     * @param  int $node_id key node
     */
    private function build($arr, &$node_array = array(), 
                                 $parent_id = NULL, 
                                 $node_id = 0, 
                                 $node = 'node_id', 
                                 $parent = 'parent_id') {
        // многомерный родительский массив перебираем
        foreach ($arr as $value) {
            if ($value[$parent] == $parent_id) {
                $node_array['array'][$value[$node]] = $value;
            }
        }
        if (isset($node_array['array'])) {
            foreach ($node_array['array'] as $val) {

                $this -> build($arr, $node_array['array'][$val[$node]], $val[$node]);
            }

        }
        $this -> a = $node_array;
        return $node_array;
    }

}

$obj = new Tree;
$obj -> building_tree();
print_r($obj -> a);

В итоге должно получится что-то вроде такого на выходе

Array
(
    [array] => Array
        (
            [1] => Array
                (
                    [node_id] => 1
                    [parent_id] => 
                    [title] => Node 1
                    [array] => Array
                        (
                            [2] => Array
                                (
                                    [node_id] => 2
                                    [parent_id] => 1
                                    [title] => Node 2
                                    [array] => Array
                                        (
                                            [3] => Array
                                                (
                                                    [node_id] => 3
                                                    [parent_id] => 2
                                                    [title] => Node 3
                                                )

                                            [4] => Array
                                                (
                                                    [node_id] => 4
                                                    [parent_id] => 2
                                                    [title] => Node 4
                                                )

                                        )

                                )

                        )

                )

            [5] => Array
                (
                    [node_id] => 5
                    [parent_id] => 
                    [title] => Node 5
                )

        )

)

 

Category: Uncategorized