#! perl -slw
use strict;
sub traverse {
my( $ref, $under, $level, $code ) = @_;
for my $node (
grep{ $_->{level} == $level && $_->{under} == $under } @$ref
) {
local $_ = $node;
$code->();
traverse( $ref, $node->{pageid}, $level+1, $code );
}
}
my $sqldata = [
{ pageid => 1, level => 1, under => 0, pagename => 'Groups' },
{ pageid => 2, level => 1, under => 0, pagename => 'About' },
{ pageid => 5, level => 3, under => 4, pagename => 'Tea' },
{ pageid => 4, level => 2, under => 1, pagename => 'Womens' },
{ pageid => 6, level => 4, under => 5, pagename => 'Registration' },
{ pageid => 7, level => 2, under => 1, pagename => 'Mens' },
{ pageid => 8, level => 3, under => 4, pagename => 'Retreat' }
];
traverse $sqldata, 0, 1, sub {
print '---' x ( $_->{level} - 1 ), $_->{pagename}, '
';
};
__END__
P:\test>457652
Groups
---Womens
------Tea
---------Registration
------Retreat
---Mens
About