Yol göstermesi açısından size basit bir şey hazırladım:
class Menu {
/**
* Menü verisi
*
* @var array $data
*/
protected $data;
public function __construct($data)
{
$this->data = $data;
}
/**
* Verilen datadan menü oluşturur
*
* @param null $parentId
* @return null|string
*/
public function generate($parentId = null)
{
$result = null;
foreach ($this->data as $item)
if ($item['parent_id'] == $parentId) {
$result .= '<li>';
$result .= '<a href="'.$item['url'].'">'.$item['name'].'</a>';
// Burada recursive olarak alt menüleri oluşturuyoruz
$result .= $this->generate($item['id']);
$result .= '</li>';
}
return !is_null($result) ? "<ul>" . $result . "</ul>" : null;
}
/**
* Menüyü ekrana basar
*/
public function render()
{
echo $this->generate();
}
}
Örnek olarak:
$sampleData = [
[
'id' => 1,
'parent_id' => 0,
'name' => 'Link 1',
'url' => '#'
],
[
'id' => 2,
'parent_id' => 0,
'name' => 'Link 2',
'url' => '#'
],
[
'id' => 3,
'parent_id' => 0,
'name' => 'Link 3',
'url' => '#'
],
[
'id' => 4,
'parent_id' => 2,
'name' => 'Link 2-1',
'url' => '#'
],
[
'id' => 5,
'parent_id' => 2,
'name' => 'Link 2-2',
'url' => '#'
],
[
'id' => 6,
'parent_id' => 2,
'name' => 'Link 2-3',
'url' => '#'
],
[
'id' => 7,
'parent_id' => 5,
'name' => 'Link 2-2-1',
'url' => '#'
],
[
'id' => 8,
'parent_id' => 5,
'name' => 'Link 2-2-2',
'url' => '#'
]
];
(new Menu($sampleData))->render();
Çıktısı
<ul>
<li><a href="#">Link 1</a></li>
<li>
<a href="#">Link 2</a>
<ul>
<li><a href="#">Link 2-1</a></li>
<li>
<a href="#">Link 2-2</a>
<ul>
<li><a href="#">Link 2-2-1</a></li>
<li><a href="#">Link 2-2-2</a></li>
</ul>
</li>
<li><a href="#">Link 2-3</a></li>
</ul>
</li>
<li><a href="#">Link 3</a></li>
</ul>
Baum dışında daha güncel olan şu paketi de kullanabilirsiniz:
https://github.com/lazychaser/laravel-nestedset
Ayrıca sizin veri yapısı adjacency list olarak geçiyor; baum ve laravel-nestedset ise nested set denen yöntemi kullanıyor. Adjacency List ile Nested Set olayını araştırın, artıları ve eksileri var.