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'	=>	''
	)
);

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 . '
    '; }

    oliver Ich heisse Oli und komme aus dem wuseligen Berlin. Meine Leidenschaft für Webseiten hält seit mehr 10 Jahren an. Dabei ist es egal ob ich kleinere oder größere Projekte umsetze - ich hänge mich in jedes Projekt mit voller Leidenschaft rein und versuche mich dabei immer wieder neu zu entdecken und neue Ideen umzusetzen.

    Hinterlasse ein Kommentar

    Eine Antwort zu “PHP – Tage mit gleichen Öffnungszeiten zusammenfügen”

    1. JoshuaCledy sagt:

      Hello. And Bye.

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht.

    Letzte Aktualisierung am 21.11.2018 / Affiliate Links / Bilder von der Amazon Product Advertising API