pcguy
Goto Top

Mehrdimensionales arrays durchsuchen

Hallo zusammen

Ich möchte ein Mehrdimensionales arrays vergeichen und komme nicht weiter.
Da ich noch nicht so erfahren bin, kann es auch einen kleiner Fehler sein face-wink

 array('Montag','08:00','12:00'),    //Mo  
  array('Montag','13:30','18:30'),  
  array('Dienstag','08:00','12:00'),  //Di  
......


Nun möchte ich vergleichen ob das Geschäft im Moment offen ist, leider klappt bereits der Wochentag vergleich nicht:

foreach( $offen as $oeffnungszeiten)
{
   
if ( $wochentag == $oeffnungszeiten )
       { echo "offen";}   
else { echo "test";}   

}

Ausgabe = Für jeden Arrey kommt ein test face-smile

Content-ID: 338771

Url: https://administrator.de/contentid/338771

Ausgedruckt am: 24.11.2024 um 17:11 Uhr

132895
132895 24.05.2017, aktualisiert am 25.05.2017 um 18:42:59 Uhr
Goto Top
Machs doch so:
<?php
$times = array('Mon' => array(  
					array('08:00','12:00'),  
					array('13:00','17:00')  
				),
				'Tue' => array(  
					array('08:00','12:00'),  
					array('13:00','17:00')  
				),
				'Wed' => array(  
					array('08:00','12:00'),  
					array('13:00','16:00')  
				),
				'Thu' => array(  
					array('08:00','12:00'),  
					array('13:00','16:00')  
				),
				'Fri' => array(  
					array('08:00','12:00'),  
					array('13:00','15:00')  
				)
		  );
$tz = new DateTimeZone('Europe/Berlin');  
$weekday = date('D');  
$now = new DateTime('now',$tz);  
$status = 'Closed';  
if (isset($times[$weekday])){
	foreach ($times[$weekday] as $time){
		if ($now >= (new DateTime($time,$tz)) && $now <= (new DateTime($time[1],$tz))){
			$status = "Open";  
			break;
		}
	}
}
echo $status;
?>
Gruß
em-pie
em-pie 24.05.2017 aktualisiert um 11:48:42 Uhr
Goto Top
Moin,

an welcher Stelle hast du denn dein array(x, y, z) im zweiten Code eingebunden (x= Wochentag, y=von, z=bis)?

denn woher soll denn dein Programm innerhalb der foreach-Schleife wissen, wo es den $wochentag hernehmen soll

Und du hast ja nirgendwo die DImension/ Adresse adressiert, in denen deine Wochentage/ Uhrzeiten reingeschrieben werden sollen.
Auch wäre es leichter, wenn du mit timestamps arbeitest, was das auswerten hinterher erleichtert.

Du könntest das z.B. wie folgt umsetzen (nicht schön/ elegant, aber funktional):
$open(0,0,0) = 'Montag';  
$open(0,1,0) = '08:00';  
$open(0,1,1) = '12:00';  
$open(0,2,0) = '13:30';  
$open(0,2,1) = '18:30';  
$open(1,0,0) = 'Montag';  
$open(1,1,0) = '08:00';  
$open(1,1,1) = '12:00';  
$open(1,2,0) = '13:30';  
$open(1,2,1) = '18:30';  

Als nächstes (hier jetzt nur die logischen Ansätze) gehst du mit einer Schleife her und prüfst, ob dein aktueller Wochentag passt:
for ($i = 0; $i <= 7; $i++) {
    if ($open($i, 0, 0) == 'Montag') {  
        echo "Montags von " . $open($i, 1,0) . " bis " . $open($i, 1,1);  
        echo "   und von " . $open($i, 2,0) . " bis " . $open($i, 2,1);  
    }
    elseif ($open($i, 0, 0) == 'Dienstag') {  
        echo "Dienstags von " . $open($i, 1,0) . " bis " . $open($i, 1,1);  
        echo "   und von " . $open($i, 2,0) . " bis " . $open($i, 2,1);  
    }
    ...
    else { echo "geschlossen" }  
}

Das geht auch definitiv alles schöner mit weiteren Schleifen/ einem anderen Aufbau, aber das Prinzip sollte so klarer werden

Gruß
em-pie
pcguy
pcguy 25.05.2017 um 14:14:18 Uhr
Goto Top
hallo und danke für eure Hilfe!

Für mich ist die erste Variante übersichtlicher (Anfänger).
Obwohl beim testen immer "Close" kommt und es bei mir nie auf offen wechselt.

Ich bin mir aber nicht sicher ob es daran liegt, dass ich ein ein WP Wiget eingebaut habe.


Grüsse pcguy
132895
132895 25.05.2017 aktualisiert um 18:43:34 Uhr
Goto Top
Zitat von @pcguy:
Obwohl beim testen immer "Close" kommt und es bei mir nie auf offen wechselt.
Dann hast du einen Fehler eingebaut, das obige Beispiel funktioniert hier problemlos sofern die Zeitzone des Servers übereinstimmt. Du kannst aber beim Erzeugen des DateTime Objekts noch zusätzlich die Zeitzone angeben, denn wenn die auf dem Server nicht mit der auf dem Client übereinstimmt stimmt die Zeit nicht.
DateTimeZone::EUROPE
Bzw.
new DateTimeZone('Europe/Berlin')
http://php.net/manual/de/class.datetimezone.php

p.s. Habe es oben noch ergänzt.