Sınırsız kategori sisteminden bahsediyorsunuz. Başka bir websitesinde gördüğüm ve biraz düzenleyerek kullandığım kodlar aşağıdadır. Sürekli veritabanı ile ilişki kurmaktansa tek seferde kategorileri çekip array yöntemiyle işlem yapmak daha mantıklı.

Detay için : buraya tıklayın

/**
* Sınırsız kategori fonksiyonu
*
* @author Hakan KAYA
* Emeğe saygı ...
*/

header('Content-Type:Text/html; charset=utf8 ');

// Dbden aldığınız menü veya sayfalar.
$sayfalar = array(
array(
'id' =>1 ,
'menu' => 'Anasayfa',
'ebeveyn' => 0
)
,
array(
'id' =>2 ,
'menu' => 'Hakkımızda',
'ebeveyn' => 0
)
,
array(
'id' =>3 ,
'menu' => 'İletişim',
'ebeveyn' => 0
)
,
array(
'id' =>4 ,
'menu' => 'Biz Kimiz',
'ebeveyn' => 2
)
,
array(
'id' =>5 ,
'menu' => 'Misyonumuz',
'ebeveyn' => 4
)
,
array(
'id' =>6 ,
'menu' => 'Vizyonumuz',
'ebeveyn' => 4
)
);




// Fonksyionumuz
function sayfa_nested($sayfalar , $ebeveyn = 0 , $kademe_pixel = 5 , $i = 0 , $menuler = NULL , $nested = FALSE )
{

// Sayfalar Boşşa boş döndür.
if(empty($sayfalar))
return;


// Eğer fonksiyon içinden çağırılmıyorsa
if (!$nested)
{
// Sayfaları ebeveyn idsi ile yeni dizi oluştur
foreach($sayfalar as $row):
$items[$row['ebeveyn']][] = $row;
endforeach;
}
else
{
// Nested ise gelen sayfaları al
$items = $sayfalar;
}

// Gelen sayfaları aç
foreach($items[$ebeveyn] as $sayfa)
{
// Boşluk hesapla
$bosluk = str_repeat(' ',($i*$kademe_pixel));

// Menuleri değişkene aktar
$menuler .= ''.PHP_EOL;

// Açılan menude bir alt sayfa var ise nested çağır
if (isset($items[$sayfa['id']]))
$menuler = sayfa_nested($items , $sayfa['id'] , $kademe_pixel , ($i+1) , $menuler , TRUE);

}

// Oluşan menüleri return et
return $menuler;
}


echo '';