Simdi anlatacagim konu biraz sıkıcı olabilir ama cok basit bir dille anlatmaya çalıcağım.
Hemen hemen her yazilimcinin uyguladigi veya kullandigimız search (Deep First Search – Tree) algorithmasini PHP ile uygulama kodunu size aktarmaya calisacagim.
Her seyden once veritabaninizde (Mysql) bir tablo (table) hazirlayiniz
/* ====================== menu table code ===================*/
CREATE TABLE `menu` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(250),
`link` varchar(350),
`order` int(11),
`parent` int(11) NOT NULL default ’0′ COMMENT ‘Menu Parent ID’,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
/*=========================code table end ======================*/
Yukaridaki kod sadece bir websitenin menu tablusu (table).
Order: bir menunun hangi levelde hangi sirada oldugunu gosterir.
Parent: bir menunun parentini gosterir
Simdi cok basit bir select sorgusu hazirlayalim
/*===================simple select query=====================*/
$query = “SELECT * FROM menu ORDER BY parent,order ASC”;
//diyelim ki bu sorguyu calistirdigimizde elimizde 2 boyutlu bir dizi oldugunu dusunelim.
Array (
[0] => Array( [id] => 1 [name] => Home [link] => home [parent] => 0 [order] => 1 )
[1] => Array ( [id] => 2 [name] => About Us [link] => aboutus [parent] => 0 [order] => 2 )
[2] => Array ( [id] => 3 [name] => Members [link] => members [parent] => 0 [order] => 3 )
[3] => Array ( [id] => 4 [name] => Publication [link] => publication [parent] => 0 [order] => 4 )
[4] => Array ( [id] => 5 [name] => Contact Us [link] => contactus [parent] => 0 [order] => 5 )
[5] => Array ( [id] => 6 [name] => Members Sub Item 1 [link] => member_subitem [parent] => 3 [order] => 1 )
[6] => Array ( [id] => 7 [name] => Members sub Item 2 [link] => chancellor [parent] => 3 [order] => 2 )
[7] => Array ( [id] => 8 [name] => Publication sub item 1 [link] => pub_sub_item1 [parent] => 4 [order] => 1 )
[8] => Array ( [id] => 9 [name] => Membes Sub Item2 – Sub 1 [link] => subitem_subitem1 [parent] => 7 [order] => 1 )
[9] => Array ( [id] => 10 [name] => About Us sub menu 1 [link] => aboutusubmenu1 [parent] => 2 [order] => 1 )
)
elimizdeki bu diziyi kendi kullanacağımız fonksıyona göre
$menuItem = array(); //2 boyutlu bir veri dizisi (menu data)
$menuData = array(
‘items’ => array(),
‘parents’ => array()
);
for($i=0;$i<sizeof($menuItem);$i++)
{
$menuData['items'][$menuItem[$i]['id']] = $menuItem[$i];
$menuData['parents'][$menuItem[$i]['parent']][] = $menuItem[$i]['id'];
}
bu 2 boyutlu diziden sonraki diziyi bir yine bu $menuData dizisine her kaydin parentini ve o kaydin kenidisini yine bir 2 boyutlu diziye aktariyoruz.
Ve son olarak buildMenu fonksiyonumuzu cagriyoruz. Bu sekilde bize baglantlli bir liste haline bize hazirlayacaktir.
/*===============buildMenu fonksiyonu==========================*/
function array_merge2($a, $b) {
return array_merge((array)$a, (array)$b);
}
function buildMenu_child($parentId, $menuData,$level = 0, $prefix = “-”)
{
$res = array();
$html = ”;
if (isset($menuData['parents'][$parentId]))
{
foreach ($menuData['parents'][$parentId] as $itemId)
{
$row["prefix"] = str_repeat($prefix,$level);
$row["name"] = $menuData['items'][$itemId]['name'];
$row["id"] = $menuData['items'][$itemId]['id'];
$row["link"] = $menuData['items'][$itemId]['link'];
$row["order"] = $menuData['items'][$itemId][order];
$row["parent"] = $menuData['items'][$itemId]['parent'];
// find childitems recursively
$row_res= buildMenu_child($itemId, $menuData,$level+1,$prefix);
array_push($res, $row);
$res = array_merge2($res, $row_res);
}
}
return $res;
}
/*===============================fonksiyon bitisi ==================*/
Ve son olarak bu fonksiyonu cagirip elde etigimiz sonucu istedigimiz yerde kullaniriz.
$allmenu = buildMenu_child(0, $menuData,0, “-”);
Bu fonksiyonda ilk nodu (first node) 0 (sifir) olarak Kabul ediyoruz ve ekrana bastigimizde
for($i=0;$i<sizeof($allmenu);$i++)
{
echo ,$allmenu[$i]['prefix'].$allmenu[$i]['name'].”<br />”;
}
//EKRAN CIKTISI
Home
About Us
- About Us sub menu 1
Members
- Members Sub Item 1
- Members sub Item 2
- – Membes Sub Item2 – Sub 1
Publication
- Publication sub item 1
Contact Us
Biraz karmasik gibi geldi ama soyle bir basit bir sekilde mantigini yazayim
1. Verilerin tuttugu bir tablu (menu)
2. Tabludan sorgu yaparak verileri 2 boyutlu bir diziye aktariyoruz.
3. Gelen veriyi tekrar bir duzenleriz
4. Recursive fonksiyounumuzu (buildMenu_child) cagiriyoruz
5. Son olarak elimizdeki veriyi istedigimiz sekilde kullaniriz.
Peki eger sorarsaniz nerelerde kullanabilirz. Eger dinamik bir menu, drop down list, list, category, veya departments, organization gibi konularla ki genelde kullandigimiz bir konu icin, bu alanlarda kullaniriiz.
Son Yorumlar