0

编辑:根据汤姆的建议,这是我修改后的代码。效果很好,谢谢汤姆。

<?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 answer 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 进行 foreach 并设置顶级菜单结构,该结构将为每个顶级类别创建一个 li:dropdown 元素。尝试实现 li:one-column 元素时会出现问题。每个 li:one-column 元素本质上是超级菜单中的一列,所以我最多需要四个。列中的每个 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:one-column 元素中的最大迭代次数,但它输出完全相同的数据。我需要一种方法来从它中断的地方继续 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
4

2 回答 2

2

您需要进行 2 处更改才能实现此目的。首先,您可能需要使用ceil而不是round您的$max_iteration变量。这将确保您的列始终在一致的位置拆分。

然后,改变这一行...

@if($key <= $max_iteration)

@if(($key + 1) % $max_iteration == 0)

$key 是一个从 0 开始的键,因此您需要递增它,因为我们正在处理从 1 开始的数量。然后,通过检查除以 时的余数$max_iteration,我们可以判断我们是否已经到达下一列。当键是最大迭代的倍数时,它将为零。

于 2013-10-09T11:58:42.773 回答
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
于 2013-10-08T11:13:41.333 回答