PHP – Tage mit gleichen Öffnungszeiten zusammenfügen
In einem meiner Projekte wollte ich Tage mit gleichen Öffnungszeiten zusammenfügen. Ich hätte auch einfach alle Tage untereinander schreiben können, aber aus Platztechnischen Gründen habe ich mich nicht dazu entschlossen. Vielmehr wollte ich die Tage, an denen die Öffnungszeiten identisch sind, zusammenfügen.
Ziel und Ergebnis war die folgende Ausgabe:
- Mon - Thu 08:00 - 20:00
- Fri - Sat 08:00 - 18:00
- Sun: closed
Erstellen eines arrays
Zunächst einmal habe ich mir ein array mit den Wochentagen und den jeweiligen Öffnungs- und Schließzeiten zusammengebaut. Dies sah dann so aus:
$openDays = array(
'Monday' => array(
'open' => '08:00',
'close' => '20:00'
),
'Tuesday' => array(
'open' => '08:00',
'close' => '20:00'
),
'Wednesday' => array(
'open' => '08:00',
'close' => '20:00'
),
'Thursday' => array(
'open' => '08:00',
'close' => '20:00'
),
'Friday' => array(
'open' => '08:00',
'close' => '18:00'
),
'Saturday' => array(
'open' => '08:00',
'close' => '18:00'
),
'Sunday' => array(
'open' => '',
'close' => ''
)
);
Keine Produkte gefunden.
Nun wird angefragt, ob überhaupt Öffnungszeiten hinterlegt sind. Wenn nicht, dann wird anstelle der Zeit das Wort ‚closed‘ eingetragen.
foreach ( $openDays as $day => $times ) {
if ( $times['open'] && $times['close'] ) {
$days[$day] = $times['open'] . ' - ' . $times['close'];
} else {
$days[$day] = 'closed';
}
}
Anschließend werden die Zeiten miteinander verglichen und in $summaries
gesammelt.
$summaries = array();
foreach ($days as $day => $hours) {
if (count($summaries) === 0) {
$current = false;
} else {
$current = &$summaries[count($summaries) - 1];
}
if ($current === false || $current['hours'] !== $hours) {
$summaries[] = array('hours' => $hours, 'days' => array($day));
} else {
$current['days'][] = $day;
}
}
Abfragen gleicher Öffnungszeiten
Zu guter letzt werden die Wochentage mit den gleichen Öffnungszeiten zusammengefasst. Und mit substr
kürze ich die Namen der Wochentage noch auf drei Zeichen.
foreach ($summaries as $summary) {
if (count($summary['days']) === 1) {
$openHours .= '' . substr( reset($summary['days'] ), 0, 3) . ': ' . $summary['hours'] . ' ';
} else {
$openHours .= '' . substr( reset($summary['days'] ), 0, 3) . ' - ' . substr( end($summary['days']), 0, 3) . ' ' . $summary['hours'] . ' ';
}
}
Und nun müsst Ihr die gesammelten Öffnungszeiten nur noch auf Eurer Webseite ausgeben:
if ( $openHours ) {
echo '' . $openHours . '
';
}
Der komplette Code auf einen Blick:
// ARRAY
$openDays = array(
'Monday' => array(
'open' => '08:00',
'close' => '20:00'
),
'Tuesday' => array(
'open' => '08:00',
'close' => '20:00'
),
'Wednesday' => array(
'open' => '08:00',
'close' => '20:00'
),
'Thursday' => array(
'open' => '08:00',
'close' => '20:00'
),
'Friday' => array(
'open' => '08:00',
'close' => '18:00'
),
'Saturday' => array(
'open' => '08:00',
'close' => '18:00'
),
'Sunday' => array(
'open' => '',
'close' => ''
)
);
// ARRAY ZUSAMMENSCHUSTERN
foreach ( $openDays as $day => $times ) {
if ( $times['open'] && $times['close'] ) {
$days[$day] = $times['open'] . ' - ' . $times['close'];
} else {
$days[$day] = 'closed';
}
}
// GLEICHE ÖFFNUNGSZEITEN ZUSAMMENFÜGEN
$summaries = array();
foreach ($days as $day => $hours) {
if (count($summaries) === 0) {
$current = false;
} else {
$current = &$summaries[count($summaries) - 1];
}
if ($current === false || $current['hours'] !== $hours) {
$summaries[] = array('hours' => $hours, 'days' => array($day));
} else {
$current['days'][] = $day;
}
}
// ABFRAGEN
foreach ($summaries as $summary) {
if (count($summary['days']) === 1) {
$openHours .= '' . substr( reset($summary['days'] ), 0, 3) . ': ' . $summary['hours'] . ' ';
} else {
$openHours .= '' . substr( reset($summary['days'] ), 0, 3) . ' - ' . substr( end($summary['days']), 0, 3) . ' ' . $summary['hours'] . ' ';
}
}
// ÖFFNUNGSZEITEN ANZEIGEN
if ( $openHours ) {
echo '' . $openHours . '
';
}
Hello. And Bye.
Make a more new posts please 🙂
___
Sanny