Foreach:对相同数据进行分组

时间:2015-03-10 18:33:46

标签: php for-loop foreach kirby

我正在尝试按日期对foreach语句生成的数据进行分组。我使用的是柯比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

2 个答案:

答案 0 :(得分:1)

创建一个变量来保存当前日期 - $currentDate,然后检查$projects->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  ?>  

已修改 - 如果您希望在日期之间休息,可以关闭/打开<li>

中的</li> / if
  <?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>

答案 1 :(得分:1)

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

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

这可以像下面这样简单:

$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]);
}