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:

php
				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:

php
				$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'	=>	''
	)
);
			
Mehr anzeigen

Nun wird angefragt, ob überhaupt Öffnungszeiten hinterlegt sind. Wenn nicht, dann wird anstelle der Zeit das Wort ‚closed‘ eingetragen.

php
				foreach ( $openDays as $day => $times ) {
	if ( $times['open'] && $times['close'] ) {
		$days[$day]         =  $times['open'] .  ' - ' . $times['close'];
	} else {
		$days[$day]         =  'closed';
	}
}
			
Mehr anzeigen

Anschließend werden die Zeiten miteinander verglichen und in $summaries gesammelt.

php
				$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;
	}
}
			
Mehr anzeigen

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.

php
				foreach ($summaries as $summary) {
	if (count($summary['days']) === 1) {
		$openHours		.=	'<li><span>' . substr( reset($summary['days'] ), 0, 3) . ':</span> ' . $summary['hours']  . '</li>';
	} else {
		$openHours		.=	'<li><span>' . substr( reset($summary['days'] ), 0, 3) . ' - ' . substr( end($summary['days']), 0, 3) . '</span> ' . $summary['hours'] . '</li>';
	}
}
			
Mehr anzeigen

Und nun müsst Ihr die gesammelten Öffnungszeiten nur noch auf Eurer Webseite ausgeben:

php
				if ( $openHours ) {
	echo '<ul>' . $openHours . '</ul>';
}
			
Mehr anzeigen

Der komplette Code auf einen Blick:

php
				// 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		.=	'<li><span>' . substr( reset($summary['days'] ), 0, 3) . ':</span> ' . $summary['hours']  . '</li>';
	} else {
		$openHours		.=	'<li><span>' . substr( reset($summary['days'] ), 0, 3) . ' - ' . substr( end($summary['days']), 0, 3) . '</span> ' . $summary['hours'] . '</li>';
	}
}

// ÖFFNUNGSZEITEN ANZEIGEN
if ( $openHours ) {
	echo '<ul>' . $openHours . '</ul>';
}
			
Mehr anzeigen

2 Kommentare

Schreibe ein Kommentar zu PHP – Tage mit gleichen Öffnungszeiten zusammenfügen

  1. avatar joshuacledyJoshuaCledy sagt:

    Hello. And Bye.

  2. avatar sannyvonSannyVon sagt:

    Make a more new posts please 🙂
    ___
    Sanny

Hinterlasse ein Kommentar zum Beitrag "PHP – Tage mit gleichen Öffnungszeiten zusammenfügen"

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Bereit für eine Seite, die wirklich zu dir passt? Schreib mir!