İlk sorunuzun cevabı ise temelde dizi değişkenler ve foreach döngüsünde bitiyor. Elinizdeki $footer_menus isimli çok boyutlu dizi değişkeninizi footer_menu_walk isimki fonksiyona soktuğunuz zaman, ilk satırda $children parametresini kontrol ederek işe başlıyoruz. Eğer bu bir children ise ul etiketini $string değişkenine atıyoruz, değilse boş veri atıyoruz. $footer_menus isimli dizi değişkenimiz foreach içerisine girdiğinde her iterasyonda şu kontrolleri yapıp oluşturduğumuz veriyi $string değişkenine ekliyoruz.
1. children false ise div.col etiketini bas, true ise boş,
2. menu iterasyonunda parent değeri 0 ise div.primary-btn bas, değilse demek ki bu bir children, o yüzden li etiketini bas,
3. menu iterasyonunda title değerini bas,
4. parent değeri 0 ise divi kapat.
5. children varsa recursive olarak aynı fonksiyonu tekrar çağır, bu sefer children parametresini true gönder,
6. menu iterasyonunda parent değeri 0'dan büyükse demek ki bu bir children, li'yi daha önceden açmıştık artık kapatabiliriz.
7. açık olan div ve ul etiketlerini kapat ve oluşan string ifadeyi return et.
Burada olay tüm işlemlerin sıralamasında. Bilgi seviyenizi bilmediğim için satır satır açıklamaya çalıştım. Çalışma mantığı ile ilgili sormak istediğiniz herhangi bir şey varsa sorabilirsiniz.
function footer_menu_walk($list=[],$children=false,$opt=[]){
$string = ($children ? '<ul>' : '') . PHP_EOL;
foreach ($list AS $menu){
$string .= (!$children ? '<div class="col">' : '') . PHP_EOL;
if($menu['parent'] == '0') {
$string .= '<div class="primary-btn">';
} else {
$string .= '<li>';
}
$string .= $menu['title'];
if($menu['parent']== '0') {
$string .= '</div>' . PHP_EOL;
}
if($menu['children'])
$string .= footer_menu_walk($menu['children'], true);
if($menu['parent'] != '0') {
$string .= '</li>' . PHP_EOL;
}
$string .= (!$children ? '</div>' : '') . PHP_EOL;
}
$string .= (($children) ? '</ul>' : '').PHP_EOL;
return $string;
}
echo footer_menu_walk($footer_menus,false);
ardakarakas adlı üyeden alıntı:
mesajı görüntüle