Foreach: группировать одни и те же данные

Я пытаюсь сгруппировать сгенерированные данные из оператора foreach по дате. Я использую Kirby CMS, но мне трудно выполнить следующее.

Цель (судо):

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

0

Решение

Создать переменную для хранения текущей даты — $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

Другие решения

По сути, что вы, вероятно, хотите сделать, это реорганизовать свой список в контейнеры.

** Примечание: все не проверено, но должно быть близко **

Это может быть так просто, как что-то вроде:

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

По вопросам рекламы [email protected]