Я реализовал следующие решения по @Darragh найти последовательные даты и превращая их в диапазонов дат:Некоторые помогают «синхронизироваться» две петли в PHP
Check for consecutive dates within a set and return as range
Теперь я пытаясь напечатать некоторую дополнительную информацию на выходе этого цикла. Это ошибочный сценарий я создал, на основе ответа @Darragh «s:
<?php
$output = '';
$dates = array();
$query = 'SELECT name, company, date FROM project GROUP BY date ORDER BY date';
$sth = $dbh->prepare($query);
$sth->execute();
if($sth->rowCount() > 0) {
$output .= '<ul>';
while($row = $sth->fetch()) {
array_push($dates,new DateTime($row['date']));
$name = $row['name'];
$company = $row['company'];
}
$lastDate = null;
$ranges = array();
$currentRange = array();
foreach ($dates as $date) {
if (null === $lastDate) {
$currentRange[] = $date;
} else {
$interval = $date->diff($lastDate);
if ($interval->days === 1) {
$currentRange[] = $date;
} else {
$ranges[] = $currentRange;
$currentRange = array($date);
}
}
$lastDate = $date;
}
$ranges[] = $currentRange;
foreach ($ranges as $range) {
$saverange = array();
foreach($range as $entry) {
array_push($saverange,$entry->format('Y-m-d'));
}
$startDate = array_shift($range);
$str = sprintf('%s', $startDate->format('d/m/Y'));
if (count($range)) {
$endDate = array_pop($range);
$str .= sprintf(' tot %s', $endDate->format('d/m/Y'));
}
$output .= '<li>'.$name.', '.$company.' - '.$str.'</li>';
}
$output .= '</ul>';
// Show me what you got
echo $output;
}
?>
Очевидно, что while
цикл, который перебирает выход БД из синхронизации с foreach
цикла, который выводит dateranges.
Необработанные выход DB выглядит следующим образом:
+------------------+-------------+------------+
| name | company | date |
+------------------+-------------+------------+
| EBU | Belgacom sa | 2014-09-12 |
| Mosquito Replica | Mosquito nv | 2014-09-17 |
| Mosquito Replica | Mosquito nv | 2014-09-19 |
| Mosquito Replica | Mosquito nv | 2014-09-20 |
+------------------+-------------+------------+
Что мой сценарий выхода выглядит следующим образом:
<ul>
<li>Mosquito Replica, Mosquito nv - 12/09/2014</li>
<li>Mosquito Replica, Mosquito nv - 17/09/2014</li>
<li>Mosquito Replica, Mosquito nv - 19/09/2014 tot 20/09/2014</li>
</ul>
Что мне нужно для вывода выглядит следующим образом:
<ul>
<li>EBU, Belgacom sa - 12/09/2014</li>
<li>Mosquito Replica, Mosquito nv - 17/09/2014</li>
<li>Mosquito Replica, Mosquito nv - 19/09/2014 tot 20/09/2014</li>
</ul>
Это может быть очевидно для вас, ребята, но я не могу, чтобы жизнь меня поняла. Кто покажет мне дорогу? Заранее спасибо!
Если интервал один день, но название/компания отличается, должен ли этот результат в отдельном диапазоне? если нет, какое имя/компания должна отображаться? – khartnett
Привет, нет, только не последовательные даты должны представлять новую строку. Хорошая точка зрения! – maartenmachiels