编辑:根据Tom的建议,这是我的修改后的代码。效果很好,谢谢汤姆。
<?php
$categories = Category::where('parent_id', '0')->get();
foreach($categories as $category):
$category_courses = get_courses($category->id);
$sub_categories = Category::where('parent_id', $category->id)->get();
$max_iteration = ceil(count($sub_categories) / 4);
?>
<li class="dropdown mega-menu-4">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" title="{{ $category->name }}">{{ $category->name }} <b class="caret"></b></a>
<ul class="dropdown-menu style-plain">
<li class="one-column">
<?php foreach($sub_categories as $key=>$sub_category): ?>
<ul>
<li class="nav-title">{{ $sub_category->name }}</li>
<?php foreach(get_courses($sub_category->id) as $course): ?>
<li>{{ $course->title }}</li>
<?php endforeach; ?>
</ul>
<?php if(($key + 1) % $max_iteration == 0): ?>
</li>
<li class="one-column">
<?php endif; ?>
<?php endforeach; ?>
</li>
</ul>
</li>
<?php endforeach; ?>
虽然现在我想在从#laravel IRC的machuga那里得到一些建议之后我应该在记忆中创建一棵树。基本上基于这个SO答案Flat PHP Array to Hierarchy Tree。
我正在尝试使用以下结构在我的Laravel应用程序中创建一个超级菜单,以便它与Bootstrap 2.3一起使用。
<div class="navbar">
<div class="navbar-inner">
<div class="container">
<div class="nav-collapse collapse">
<ul class="nav">
<li class="dropdown mega-menu-4 transition">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">$category <b class="caret"></b></a>
<ul class="dropdown-menu">
<li class="one-column">
<ul>
<li class="nav-title">$subCategory 1</li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
</ul>
<ul>
<li class="nav-title">$subCategory 1</li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
</ul>
</li>
<li class="one-column">
<ul>
<li class="nav-title">$subCategory 2</li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
</ul>
<ul>
<li class="nav-title">$subCategory 2</li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
</ul>
</li>
<li class="one-column">
<ul>
<li class="nav-title">$subCategory 3</li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
</ul>
<ul>
<li class="nav-title">$subCategory 3</li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
</ul>
</li>
<li class="one-column">
<ul>
<li class="nav-title">$subCategory 4</li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
</ul>
<ul>
<li class="nav-title">$subCategory 4</li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
<li><a href="#">$course</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
在我的数据库中,我有以下内容:
table: categories
fields: id, parent_id, name, slug
table: courses
fields: id, category_id, title, slug
我正在努力使用for和foreach循环逻辑,以便在li:one-column元素中生成ul元素。我想要最多4列,根据需要包含多少行,具体取决于有多少子类别。
因此,在类别表中,顶级类别不会为其分配“parent_id”,但子类别将为其分配顶级“parent_id”。
所以我可以通过$ categories作为$ category来设置并设置顶级菜单结构,这将为每个顶级类别创建一个li:dropdown元素。尝试实现li:one-column元素时出现问题。每个li:one-column元素基本上是mega菜单中的一列,所以我最多需要四个。列中的每个ul都是一个子类别。
因此,如果顶级类别下有13个子类别,则每列将具有以下内容:
Column 1: 4
Column 2: 3
Column 3: 3
Column 4: 3
然后,如果添加了新的子类别,则为:
Column 1: 4
Column 2: 4
Column 3: 3
Column 4: 3
等等。所以基本上每个新的子类别都会填满下一个可用的列。
这可能是一个非常简单的解决方案,但我现在正在努力解决逻辑问题。提前谢谢。
编辑:我正在接近使用:
<ul class="nav">
@foreach($categories as $category)
<?php
$category_courses = get_courses($category->id);
$sub_categories = Category::where('parent_id', $category->id)->get();
$sub_categories_total = count($sub_categories); // int(5)
$sub_category_split = round($sub_categories_total / 4); // int(1)
?>
<li class="dropdown mega-menu-4">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" title="{{ $category->name }}">{{ $category->name }} <b class="caret"></b></a>
<ul class="dropdown-menu style-plain">
@for($i=0; ++$i <=4;)
<li class="one-column">
@foreach($sub_categories as $sub_category)
<ul >
<li class="nav-title">{{ $sub_category->name }}</li>
@foreach(get_courses($sub_category->id) as $course)
<li>{{ $course->title }}</li>
@endforeach
</ul>
@endforeach
</li>
@endfor
</ul>
</li>
@endforeach
</ul>
我仍然不在那里,因为它将所有sub_categories添加到每个li:one-column元素。我觉得我当然更接近解决方案。
编辑:好的,我现在离我很近了。我现在只能输出每个li中的最大迭代:单列元素,但它输出完全相同的数据。我需要一种方法来从它断开的地方继续foreach循环。
<ul class="nav">
@foreach($categories as $category)
<?php
$category_courses = get_courses($category->id);
$sub_categories = Category::where('parent_id', $category->id)->get();
$max_iteration = round(count($sub_categories) / 4);
?>
<li class="dropdown mega-menu-4">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" title="{{ $category->name }}">{{ $category->name }} <b class="caret"></b></a>
<ul class="dropdown-menu style-plain">
@for($ci=0; ++$ci <=4;)
<li class="one-column">
@foreach($sub_categories as $key=>$sub_category)
@if($key <= $max_iteration)
<ul >
<li class="nav-title">{{ $sub_category->name }}</li>
@foreach(get_courses($sub_category->id) as $course)
<li>{{ $course->title }}</li>
@endforeach
</ul>
@else
<?php break; ?>
@endif
@endforeach
</li>
@endfor
</ul>
</li>
@endforeach
</ul>
编辑:好的,这是我到目前为止最接近的,它几乎就在那里。但仍然不对,因为它在第一列,第2列,第3列输出1个子类别,但在第4列输出2: - (
@foreach($categories as $category)
<?php
$category_courses = get_courses($category->id);
$sub_categories = Category::where('parent_id', $category->id)->get();
$max_iteration = round(count($sub_categories) / 4) + 1;
?>
<li class="dropdown mega-menu-4">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" title="{{ $category->name }}">{{ $category->name }} <b class="caret"></b></a>
<ul class="dropdown-menu style-plain">
<li class="one-column">
@foreach($sub_categories as $key=>$sub_category)
<ul>
<li class="nav-title">{{ $sub_category->name }}</li>
@foreach(get_courses($sub_category->id) as $course)
<li>{{ $course->title }}</li>
@endforeach
</ul>
@if($key <= $max_iteration)
</li>
<li class="one-column">
@endif
@endforeach
</li>
</ul>
</li>
@endforeach
答案 0 :(得分:2)
您需要进行2次更改才能实现此目的。首先,您可能需要为ceil
变量使用round
而不是$max_iteration
。这将确保您的列始终分成一致的位置。
然后,改变这一行......
@if($key <= $max_iteration)
到
@if(($key + 1) % $max_iteration == 0)
$ key是一个从零开始的键,所以你需要递增它,因为我们处理从1开始的数量。然后,通过检查余数除以$max_iteration
,我们可以告诉我们是否已经到了下一栏。当密钥是最大迭代次数的倍数时,它将为零。
答案 1 :(得分:0)
了解了一些你正在寻找的东西,我认为这可能更合适,所以把它想象成一个分隔符:
@foreach($categories as $category)
<?php
$category_courses = get_courses($category->id);
$sub_categories = Category::where('parent_id', $category->id)->get();
$max_iteration = round(count($sub_categories) / 4);
?>
<li class="dropdown mega-menu-4">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" title="{{ $category->name }}">{{ $category->name }} <b class="caret"></b></a>
<ul class="dropdown-menu style-plain">
<li class="one-column">
<?php $counter = 0 ?>
@foreach($sub_categories as $key=>$sub_category)
<?php $counter++ ?>
@if($counter == $max_iteration)
</li>
<li class="one-column">
<?php $counter = 0;?>
@endif
<ul >
<li class="nav-title">{{ $sub_category->name }}</li>
@foreach(get_courses($sub_category->id) as $course)
<li>{{ $course->title }}</li>
@endforeach
</ul>
@endforeach
</li>
</ul>
</li>
@endforeach