protected function prepareTree(array $categories, array $options)
    {
        $tree = array();
        $parents_tree = array();
        $children_tree = array();
        $categories_tree = array();

        $parent = isset($options['parent_id']) ? (int) $options['parent_id'] : 0;

        foreach ($categories as $category) {
            $children_tree[$category['parent_id']][] = $category['category_id'];
            $parents_tree[$category['category_id']][] = $category['parent_id'];
            $categories_tree[$category['category_id']] = $category;
        }

        $max_depth = isset($options['depth']) ? (int) $options['depth'] : count($children_tree);

        $process_parents = array();
        $process_parents[] = $parent;

        while (count($process_parents)) {
            $parent = array_pop($process_parents);
            $depth = count($process_parents);

            if ($max_depth <= $depth || empty($children_tree[$parent])) {
                continue;
            }

            $has_children = false;

            $child = current($children_tree[$parent]);

            do {
                if (empty($child)) {
                    break;
                }

                $category = $categories_tree[$child];

                $category['depth'] = $depth;
                $category['parents'] = $parents_tree[$category['category_id']];

                $tree[$category['category_id']] = $category;

                if (!empty($children_tree[$category['category_id']])) {
                    $has_children = true;
                    $process_parents[] = $parent;
                    $process_parents[] = $category['category_id'];
                    reset($categories_tree[$category['category_id']]);
                    next($children_tree[$parent]);
                    break;
                }
            } while ($child = next($children_tree[$parent]));

            if (!$has_children) {
                reset($children_tree[$parent]);
            }
        }

        return $tree;
    }
protected function prepareTree(array $categories, array $options)
    {
        $tree = array();
        $parents_tree = array();
        $children_tree = array();
        $categories_tree = array();

        $parent = isset($options['parent_id']) ? (int) $options['parent_id'] : 0;

        foreach ($categories as $category) {
            $children_tree[$category['parent_id']][] = $category['category_id'];
            $parents_tree[$category['category_id']][] = $category['parent_id'];
            $categories_tree[$category['category_id']] = $category;
        }

        $max_depth = isset($options['depth']) ? (int) $options['depth'] : count($children_tree);

        $process_parents = array();
        $process_parents[] = $parent;

        while (count($process_parents)) {
            $parent = array_pop($process_parents);
            $depth = count($process_parents);

            if ($max_depth <= $depth || empty($children_tree[$parent])) {
                continue;
            }

            $has_children = false;

            $child = current($children_tree[$parent]);

            do {
                if (empty($child)) {
                    break;
                }

                $category = $categories_tree[$child];

                $category['depth'] = $depth;
                $category['parents'] = $parents_tree[$category['category_id']];

                $tree[$category['category_id']] = $category;

                if (!empty($children_tree[$category['category_id']])) {
                    $has_children = true;
                    $process_parents[] = $parent;
                    $process_parents[] = $category['category_id'];
                    reset($categories_tree[$category['category_id']]);
                    next($children_tree[$parent]);
                    break;
                }
            } while ($child = next($children_tree[$parent]));

            if (!$has_children) {
                reset($children_tree[$parent]);
            }
        }

        return $tree;
    }
protected function prepareTree ( array $ categories , array $ options ) { $ tree = array ( ) ; $ parents_tree = array ( ) ; $ children_tree = array ( ) ; $ categories_tree = array ( ) ; $ parent = isset ( $ options [ 'parent_id' ] ) ? ( int ) $ options [ 'parent_id' ] : 0 ; foreach ( $ categories as $ category ) { $ children_tree [ $ category [ 'parent_id' ] ] [ ] = $ category [ 'category_id' ] ; $ parents_tree [ $ category [ 'category_id' ] ] [ ] = $ category [ 'parent_id' ] ; $ categories_tree [ $ category [ 'category_id' ] ] = $ category ; } $ max_depth = isset ( $ options [ 'depth' ] ) ? ( int ) $ options [ 'depth' ] : count ( $ children_tree ) ; $ process_parents = array ( ) ; $ process_parents [ ] = $ parent ; while ( count ( $ process_parents ) ) { $ parent = array_pop ( $ process_parents ) ; $ depth = count ( $ process_parents ) ; if ( $ max_depth <= $ depth || empty ( $ children_tree [ $ parent ] ) ) { continue ; } $ has_children = false ; $ child = current ( $ children_tree [ $ parent ] ) ; do { if ( empty ( $ child ) ) { break ; } $ category = $ categories_tree [ $ child ] ; $ category [ 'depth' ] = $ depth ; $ category [ 'parents' ] = $ parents_tree [ $ category [ 'category_id' ] ] ; $ tree [ $ category [ 'category_id' ] ] = $ category ; if ( ! empty ( $ children_tree [ $ category [ 'category_id' ] ] ) ) { $ has_children = true ; $ process_parents [ ] = $ parent ; $ process_parents [ ] = $ category [ 'category_id' ] ; reset ( $ categories_tree [ $ category [ 'category_id' ] ] ) ; next ( $ children_tree [ $ parent ] ) ; break ; } } while ( $ child = next ( $ children_tree [ $ parent ] ) ) ; if ( ! $ has_children ) { reset ( $ children_tree [ $ parent ] ) ; } } return $ tree ; }
Create a tree structure from an array of categories
@param array $categories
@param array $options
@return array
Create a tree structure from an array of categories