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-Key: 338771

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

Printed on: April 27, 2024 at 01:04 o'clock

Mitglied: 132895
132895 May 24, 2017, updated at May 25, 2017 at 16:42:59 (UTC)
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ß
Member: em-pie
em-pie May 24, 2017 updated at 09:48:42 (UTC)
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
Member: pcguy
pcguy May 25, 2017 at 12:14:18 (UTC)
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
Mitglied: 132895
132895 May 25, 2017 updated at 16:43:34 (UTC)
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.