the problem i want to solve is the dynamic creation of a hashed tree from the result of a database query. i tried to solve it with arrays only the success was minor.
what i need is a tree of the following scheme:
root
=> node1
=> node2
=> node2.1
=> node2.2
=> node3
the problem is that the structure has no defined depth. and btw, though it looks like another forum aproach it isn't. :)
here is what i tried:
for (my $i=0; $i < $counter; $i++)
{
my $result = $sth->fetchrow_hashref ();
# root node
if (scalar @path == 0)
{
$offset = $result->{'lvl'} - 1;
push @path, $result->{'payload'};
push @tree, $result->{'payload'};
next;
}
# child node
else
{
# going down (one step only)
if (($result->{'lvl'} - $offset) > scalar @path)
{
my $last = $path[$#path];
push @path, $result->{'payload'};
push @{$tree[$#path][0]}, $result->{'payload'};
$a_counter = 0;
}
# same level
elsif (($result->{'lvl'} - $offset) == scalar @path)
{
my $last = $path[$#path -1];
push @{$tree[$#path][$a_counter]}, $result->{'payload'
+};
$a_counter++;
}
# going up
else
{
my $steps = scalar @path - $result->{'lvl'} + ($offset
+ -1);
$#path = $steps;
push @path, $result->{'payload'};
my $last = $path[$#path];
push @{$tree[$#path][0]}, $result->{'payload'};
$a_counter = 0;
}
}
the result as you may figure out is a array with tree arrays in it without assotiation to the parent.
the database structure is a nested set as found at celko's "sql for smarties", just modified to have more smaller trees instead of one giant one to speed up inserts.