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

    2 Kommentare 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.

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