Adjacency Table to Hierarchy
Here's a way to turn an adjacency table into a hierarchy in html.
<?php
$menu = array();
$menu[] = array( 'id' => 1, 'parent_id' => 0, 'name' => 'a' );
$menu[] = array( 'id' => 2, 'parent_id' => 1, 'name' => 'a.1' );
$menu[] = array( 'id' => 3, 'parent_id' => 0, 'name' => 'b' );
$menu[] = array( 'id' => 4, 'parent_id' => 3, 'name' => 'b.1' );
$menu[] = array( 'id' => 5, 'parent_id' => 3, 'name' => 'b.2' );
$menu[] = array( 'id' => 6, 'parent_id' => 5, 'name' => 'b.2.1' );
// acts like a SELECT statement
function selectWhereParentIdIs( $id )
{
global $menu;
$out = array();
for( $i=0; $i<count($menu); $i++ )
{
if ($menu[$i]['parent_id']==$id)
$out[] = $menu[$i];
}
return $out;
}
function menuToHtml( $id )
{
$ar = selectWhereParentIdIs( $id );
if ( count($ar) > 0 )
{
$out .= '<ol>';
reset( $ar );
foreach( $ar as $value )
{
$out .= '<li>'.$value['name'];
$out .= menuToHtml( $value['id'] );
$out .= '</li>';
}
$out .= '</ol>';
return $out;
}
else
{
return '';
}
}
echo menuToHtml( 0 );
?>
And here's a select version
<?php
$menu = array();
$menu[] = array( 'id' => 1, 'parent_id' => 0, 'name' => 'a' );
$menu[] = array( 'id' => 2, 'parent_id' => 1, 'name' => 'a.1' );
$menu[] = array( 'id' => 3, 'parent_id' => 0, 'name' => 'b' );
$menu[] = array( 'id' => 4, 'parent_id' => 3, 'name' => 'b.1' );
$menu[] = array( 'id' => 5, 'parent_id' => 3, 'name' => 'b.2' );
$menu[] = array( 'id' => 6, 'parent_id' => 5, 'name' => 'b.2.1' );
// acts like a SELECT statement
function selectWhereParentIdIs( $id )
{
global $menu;
$out = array();
for( $i=0; $i<count($menu); $i++ )
{
if ($menu[$i]['parent_id']==$id)
$out[] = $menu[$i];
}
return $out;
}
function menuToSelect( $id, $depth )
{
$ar = selectWhereParentIdIs( $id );
if ( count($ar) > 0 )
{
reset( $ar );
foreach( $ar as $value )
{
$out .= '<option>';
if ($depth>0) $out .= '-';
$out .= str_repeat( '-', $depth ) . $value['name'];
$out .= '</option>';
$out .= menuToSelect( $value['id'], $depth+1 );
}
return $out;
}
else
{
return '';
}
}
echo '<form><select>';
echo menuToSelect( 0, 0 );
echo '</select>';
?>

