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

    revilodesign oli

    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

    Schreibe einen Kommentar zu SannyVon Antworten abbrechen

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

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

    Follow Me

    doch mal auf Instagram