On Mon, May 17, 2010 at 9:13 AM, Richard Quadling

> OOI, can you take a look at my first response. Is this the sort of
> thing you were talking about?

Essentially, yes. For the temporary array I would map nid => element instead
of INDEX => nid. Your $Relationships array is basically the same as $Data.
The goal is to make the lookup of parentID fast. This would be automatic if
the keys of $Data were the nid values instead of a raw index from 0..N-1. If
the relationship INDEX = nid - 1 for all elements in $Data, the temporary
array also isn't needed.

Here's how I would code it:

    function makeTreeAndReturnRoots(&$arr)
        // not necessary if $arr is guaranteed to contain at least one root
        $map[0]['children'] = array();
        // map each nid to its node
        foreach ($arr as $index => &$node) {
            $map[$node['nid']] = $node;
        // add each node to its parent's children array
        foreach ($map as $nid => &$node) {
            $map[$parentID]['children'][] = $node;
        // return the array of root nodes
        return $map[0]['children'];

Note: I haven't tested the above so my reference usage may be off, but it
illustrates the basic algorithm. Each node requires a single ArrayPut
operation to create $map and a single ArrayGet to lookup the parent node in
$map in addition to the two attribute accesses for nid and children (also
ArrayGet operations). Since all of the keys are unique in their respective
hashtables, these operations should all be O(1) making the entire algorithm
O(2n) which simplifies to O(n).


Reply via email to