【问题标题】:Foreach: Group same dataForeach:分组相同的数据
【发布时间】:2015-03-11 03:11:54
【问题描述】:

我正在尝试按日期对来自 foreach 语句的生成数据进行分组。我正在使用 Kirby CMS,但在完成以下任务时遇到了麻烦。

目标(sudo):

date: 03/10/15
Take Over

date: 03/09/15
Video
Flash
Super GIF 2
Super GIF
Image

我的尝试:

date: 03/10/15
Take Over
date: 03/09/15
Video
date: 03/09/15
Flash
date: 03/09/15
Super GIF 2
date: 03/09/15
Super GIF
date: 03/09/15
Image

代码:

  <ul>
    <?php foreach($page->children()->visible()->sortBy('modified', 'desc')  as $projects): ?>
      <li>
        date: <?php echo $projects->modified('m/d/y') ?> <br>
        <a href="<?php echo $projects->url() ?>"><?php echo $projects->title()->html() ?></a>
      </li>
    <?php endforeach  ?>  
  </ul>

第二次尝试失败:

  <ul>
      <?php foreach($page->children()->visible()->sortBy('modified', 'desc')  as $projects): ?>
       <li>
          <?php foreach($page->children()->visible()->sortBy('modified', 'desc')  as $project): ?>

            <?php 
              if($projects->modified('m/d/y') == $project->modified('m/d/y')) {
                echo $project->modified('m/d/y') . '<br>' . $project->title();
              }

            ?>

          <?php endforeach  ?>  
       </li>


    <?php endforeach  ?>  
  </ul>

输出:

03/10/15
Take Over
03/09/15
Video 03/09/15
Flash 03/09/15
Super GIF 2 03/09/15
Super GIF 03/09/15
Image
03/09/15
Video 03/09/15
Flash 03/09/15
Super GIF 2 03/09/15
Super GIF 03/09/15
Image
03/09/15
Video 03/09/15
Flash 03/09/15
Super GIF 2 03/09/15
Super GIF 03/09/15
Image
03/09/15
Video 03/09/15
Flash 03/09/15
Super GIF 2 03/09/15
Super GIF 03/09/15
Image
03/09/15
Video 03/09/15
Flash 03/09/15
Super GIF 2 03/09/15
Super GIF 03/09/15
Image

【问题讨论】:

  • 我认为你需要一个嵌套的 foreach 循环。你试过这种方法吗?
  • 您只需要跟踪当前日期以及它与上一个日期相比的变化时间。只需使用 if 来检查和回显。
  • 更新了我的尝试 2,它更好,但它不应该重复 03/09/15 那么多次。只显示一次。

标签: php for-loop foreach kirby


【解决方案1】:

创建一个变量来保存当前日期 - $currentDate,然后检查 $projects-&gt;modified('m/d/y') 是否与 $currentDate 匹配,如果不匹配,则将其设置为 $currentDate 并回显它-

  <?php $currentDate = ''; ?>
  <ul>
    <?php foreach($page->children()->visible()->sortBy('modified', 'desc')  as $projects): ?>
      <li>
        <?php if($projects->modified('m/d/y') != $currentDate) { $currentDate = $projects->modified('m/d/y'); ?>
        date: <?php echo $projects->modified('m/d/y') ?> <br>
        <?php } ?>
        <a href="<?php echo $projects->url() ?>"><?php echo $projects->title()->html() ?></a>
      </li>
    <?php endforeach  ?>  

已编辑 - 如果您想要日期之间的休息时间,您可以关闭/打开 if 内的 &lt;li&gt;/&lt;/li&gt;

  <?php $currentDate = ''; ?>
  <ul>
    <?php foreach($page->children()->visible()->sortBy('modified', 'desc')  as $projects): ?>
      <li>

        <?php if($projects->modified('m/d/y') != $currentDate) { 
            if($currentDate != '') { echo "</li><li>"; } // if not the 1st date, add a blank space/li before the next date 
            $currentDate = $projects->modified('m/d/y'); ?>
        date: <?php echo $projects->modified('m/d/y') ?>
        <?php } ?>

        <br><a href="<?php echo $projects->url() ?>"><?php echo $projects->title()->html() ?></a>

    <?php endforeach  ?>  
      </li>
  </ul>

【讨论】:

  • 谢谢,这很接近,但分组不能 100% 正常工作,请看截图:i.imgur.com/aD5pWGl.png?1 第二个日期以下的所有内容,都应该在同一个 li 标记中。
  • 我已经重新编辑了。您需要在if() - if($currentDate != '') { echo "&lt;/li&gt;&lt;li&gt;"; } 中关闭/打开&lt;li&gt;s,并且您需要将最后一个/最后一个&lt;/li&gt; 移动到&lt;?php endforeach ?&gt; 之后。
  • 不,它仍然无法正常工作,但我设法自己修复了它:jsfiddle.net/22fx4ew1 感谢您的所有帮助
【解决方案2】:

基本上您可能想要做的是将您的列表重新组织到容器中。

** 注意:所有未经测试,但应该关闭 **

这可以像这样简单:

$containers = [];
foreach ($bar as $foo) {
  $containers[$foo['date']][] = $foo
}

ksort($containers);

如果您使用的是 PHP5.5+,那么您的运气会更好:

$containers = array_column($bar, null, 'date');
ksort($containers);

这应该为您提供循环所需的结构:

$dates = array_keys($containers);
foreach ($dates as $container) {
  echo 'date: '.$container;
  var_dump($containers[$container]);
}

【讨论】:

    猜你喜欢
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2022-11-04
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多