MySQL到PHP输出包含分组内容(类别)的HTML

MySQL到PHP输出包含分组内容(类别)的HTML,php,html,Php,Html,我有一个问题,我在谷歌上搜索allot试图解决,但所有的解决方案都是我的变体。 所以我有这样的输出 <div class="row"> <?php $cat= '';?> <div class="blank"> @foreach($posts as $post) @if($cat!= $post->cat_id) </div><div class="col-sm-3"> <p class="alert

我有一个问题,我在谷歌上搜索allot试图解决,但所有的解决方案都是我的变体。 所以我有这样的输出

<div class="row">
<?php $cat= '';?>
<div class="blank">
@foreach($posts as $post)
  @if($cat!= $post->cat_id)
    </div><div class="col-sm-3">
      <p class="alert alert-info"><strong>{{$post->category_name}}</strong></p>
    <?php $cat= $post->cat_id; ?>
  @endif

  </ul><ul>
  <li>
    {{$post->title}}
  </li>
@endforeach

@foreach($posts作为$post)
@如果($cat!=$post->cat\u id)

{{$post->category_name}

@恩迪夫
    • {{$post->title}
    • @endforeach

所以基本上我不会输出类别名称,然后在ulli中输出该类别中该div的所有帖子,然后关闭该div。 但我只使用了这个空白div,并在打开之前关闭ul和div,但这给了我无效的html,但排序良好。 有什么聪明的方法可以做到这一点吗

谢谢
以下是一个工作示例。我认为问题在于你打开和关闭foreach的地方

(为了清晰起见,我替换了普通php的blade语句,但您应该能够将其更改回来。)

编辑:

我离那不远

<?php $posts = [
    ['cat_id' => 1, 'cat_name' => 'a name', 'title' => 'title'], 
    ['cat_id' => 1, 'cat_name' => 'a name2', 'title' => 'title2'],
    ['cat_id' => 2, 'cat_name' => 'another name', 'title' => 'title3'],
    ['cat_id' => 2, 'cat_name' => 'another name2', 'title' => 'title4'],
]; ?>


<div class="col-sm-3">

    <?php $cat= '';?>

    <?php foreach($posts as $post): ?>   

        <?php if($post['cat_id'] != $cat): ?>

        <p class="alert alert-info">
            <strong><?php echo $post['cat_name'];?></strong>
        </p>

        <ul>

        <?php endif; ?>

        <li> <?=$post['cat_name'];?> </li>

        <?php if($post['cat_id'] == $cat): ?>
        </ul>
        <?php endif; ?>

        <?php $cat= $post['cat_id']; ?>

    <?php endforeach; ?>

</div>

在这里,我编辑了我之前的答案,并提出了以下几点建议:

  • 关键不在于只编写有效的代码,还要编写可维护和可读的代码。这将有助于您或任何人在将来更改某些功能

  • 在提问时尽量清晰,如果需要,请提供所需输出的示例(就像在评论中一样)

  • 您可能可以在将数据传递到视图之前格式化数据,以便轻松打印数据,例如,将我在上述代码中使用的数组转换为如下内容:

    $posts=[ ['cat_id'=>1,'cat_name'=>a name','posts'=>[ ['title'=>'a title','content'=>'whatever'], ['title'=>'另一个标题','content'=>'whatever2'], ] ])

那样的话,展示它会更容易,而且它会给你展示的方式 编写更清晰的代码


致以最诚挚的问候!

所以经过广泛的尝试,我得到了我想要的。希望这是正确的方法

<?php
  $cat= '';
  foreach($posts as $post){
   if($cat != $post['cat_id']){
   echo $cat!= '' ? '</ul></div>' : '';
   echo  '<div class="col-sm-4 col-md-3">
           <p class="alert alert-info"><strong>'.$post['cat_name'].'</strong></p>
            <ul>';
    $cat= $post['cat_id'];
  }
         echo '<li>'.$post['title'].'</li>';
}
     echo '</ul>'; //close last opened ul
echo '</div>'; //close last opened div
 ?>


我必须问一下,@foreach是什么,这是php代码吗?首先请解释您使用的代码为什么在这里使用@ru是什么意思……它看起来像刀片模板,但您需要确认您在这里使用的模板语言。此外,您正在关闭一个不存在的
,并打开一个您从未使用过的模板语言ose,在这段代码的底部。嗨,是的,我很抱歉,没有提到。是的,这是刀片模板引擎。我知道,这是它的工作代码。我只需要正确的逻辑。所以我需要在一个
    标记之前打开它,这样就可以关闭它了?既然你看到了问题所在,我需要在创建的元素中循环元素。tat ul和f是一样的我制作的第一个div,这样我可以在第一个循环开始时关闭它。嘿,很抱歉延迟回复,不,这甚至还没有关闭,您在
    div
    之前打开
    ul
    标记,将
    row
    包装成列,而不是列,并且您将得到两行,而不是应该作为输出的两列。这是我想要的输出

    职位类别

      职位1
    • 职位2
    • .

    职位类别2

    • 职位1a
    • 职位2a
    • .