Nested sets, php array and transformation
Asked Answered
V

1

5

I need to transform my nested sets structure (mysql) into json for this spacetree 1) http://blog.thejit.org/wp-content/jit-1.0a/examples/spacetree.html

I found this function to create an array from nested sets: 2) http://semlabs.co.uk/journal/converting-nested-set-model-data-in-to-multi-dimensional-arrays-in-php

I can also convert php array into json with PHP function json_encode

My problem: the function nestify (from second link) gives me not exactly that i need. I need something like this: http://pastebin.com/m68752352

Can you help me change the function "nestify" so it gives me the correct array?

Here is this function one more time:

function nestify( $arrs, $depth_key = 'depth' )
    {
        $nested = array();
        $depths = array();

        foreach( $arrs as $key => $arr ) {
            if( $arr[$depth_key] == 0 ) {
                $nested[$key] = $arr;
                $depths[$arr[$depth_key] + 1] = $key;
            }
            else {
                $parent =& $nested;
                for( $i = 1; $i <= ( $arr[$depth_key] ); $i++ ) {
                    $parent =& $parent[$depths[$i]];
                }

                $parent[$key] = $arr;
                $depths[$arr[$depth_key] + 1] = $key;
            }
        }

        return $nested;
    }
Vaunting answered 8/5, 2009 at 17:46 Comment(0)
H
10

The following snippet should do the trick, adapted from some PHP Doctrine code I found on the web :

function toHierarchy($collection)
{
        // Trees mapped
        $trees = array();
        $l = 0;

        if (count($collection) > 0) {
                // Node Stack. Used to help building the hierarchy
                $stack = array();

                foreach ($collection as $node) {
                        $item = $node;
                        $item['children'] = array();

                        // Number of stack items
                        $l = count($stack);

                        // Check if we're dealing with different levels
                        while($l > 0 && $stack[$l - 1]['depth'] >= $item['depth']) {
                                array_pop($stack);
                                $l--;
                        }

                        // Stack is empty (we are inspecting the root)
                        if ($l == 0) {
                                // Assigning the root node
                                $i = count($trees);
                                $trees[$i] = $item;
                                $stack[] = & $trees[$i];
                        } else {
                                // Add node to parent
                                $i = count($stack[$l - 1]['children']);
                                $stack[$l - 1]['children'][$i] = $item;
                                $stack[] = & $stack[$l - 1]['children'][$i];
                        }
                }
        }

        return $trees;
}
Helicline answered 20/5, 2009 at 9:0 Comment(3)
Can anybody tell me what the & does in for example $stack[] = & $trees[$i];Guayaquil
It stores the reference of the tree item into the stack (which is just a pointer to the current object instead of a copy of it). For more info you could read the References Explained chapter in the PHP manual.Helicline
Important thing. To use this function you need to apply ordering items of collection by left_id (it's service field of nested sets structure) column!Digitoxin

© 2022 - 2024 — McMap. All rights reserved.