Zur Navigation

Daten aus php-Datei einlesen und ausgeben

1 uwe

Hallo,
in einer php Datei stehen Buchungsdaten:
[code<?php
$calendar[1]['object'] = 'test';
$calendar[1]['descr'] = '';
$calendar[1]['showfrom'] = 'heute';
$calendar[1]['showuntil'] = '31.12.2008';
$calendar[1]['dates'][9]['sort'] = 2454465;
$calendar[1]['dates'][9]['from'] = '30.09.2007';
$calendar[1]['dates'][9]['until'] = '06.10.2007';
$calendar[1]['dates'][9]['comment'] = '- Werner';
$calendar[1]['dates'][10]['sort'] = 2454541;
$calendar[1]['dates'][10]['from'] = '15.03.2008';
$calendar[1]['dates'][10]['until'] = '29.03.2008';
$calendar[1]['dates'][10]['comment'] = '- Müller';
$calendar[1]['dates'][11]['sort'] = 2454577;
$calendar[1]['dates'][11]['from'] = '20.04.2008';
$calendar[1]['dates'][11]['until'] = '26.04.2008';
$calendar[1]['dates'][11]['comment'] = '- Spann';
$calendar[1]['dates'][12]['sort'] = 2454604;
$calendar[1]['dates'][12]['from'] = '17.05.2008';
$calendar[1]['dates'][12]['until'] = '31.05.2008';
$calendar[1]['dates'][12]['comment'] = '- Still';
$calendar[1]['dates'][13]['sort'] = 2454669;

$calendar[1]['dl']['geaendert'] = 1;
?>
[/code]

Die Daten aus FROM und UNTIL bearbeitet werden.

Die Ausgabe soll als einfache Textausgabe (oder Tabelle):
z.B.

15.03.2008 - 29.03.2008
20.04.2008 - 26.04.2008
.....

Aber: bei FROM nur die Zeile ausgeben, wenn das FROM - Datum
größer ist als date()

folgenden Ansatz habe ich:
<html>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<head>
<title>Belegung</title>
</head>
<body>



<?

$daten = implode (file ("daten.php"), ""); // file() liest die Datei in ein Array ein

?>

<?

foreach ($werte as $w) { // Ausgabe der Daten des Array
  // jetzt nach from und until suchen

$pos = strpos("from", $werte); 
$pos1 = strpos("until", $werte);

// wenn gefunden dann....
if ($pos == true and $pos > date()) ==  ($pos1 == true){
   

// hier ist noch einiges falsch
$value = substr($pos, $pos, 10);  // Ausgabe der Daten  
$value2 = substr($pos1, $pos1, 10);  // Ausgabe der Daten  

       echo "<p>".$value."-".$value2"</p>";

   }

?>

</body>
</html>

Vielleicht muss da auch ganz anders rangehen!!
Gruss
Uwe

16.11.2007 19:17

2 Jörg Kruse

Hallo Uwe,

um Zeitpunkte miteinander vergleichen zu können, müssen diese in einem numerischen Format vorliegen, vorzugsweise dem Unix Timestamp. Mit mktime() lassen sich die Datumsangaben in den Timestamp umrechnen. (Besser wäre es, die Daten direkt im Unix-Timestamp-Format im Array abzuspeichern - und erst nach dem Vergleich in ein mithilfe von date() in ein Ausgabeformat zu verwandeln)

In der zweiten Datei gibt es noch einige syntaktische und logische Fehler:

- die foreach Schleife ist nicht geschlossen

- der Array $werte ist nicht definiert

- die zwei Klammerausdrücke mit einem == zu verknüpfen, ergibt keinen Sinn (?):
if ($pos == true and $pos > date()) ==  ($pos1 == true){

- hier fehlt noch ein Punkt:
echo "<p>".$value."-".$value2."</p>";

16.11.2007 22:21

3 uwe

Hallo Jörg,
da komme ich jetzt an meine Grenzen:

<html>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<head>
<title>Belegung</title>
</head>
<body>



<?

$daten = implode (file ("daten.php"), ""); // file() liest die Datei in ein Array ein

?>

<?

foreach ($werte as $w) { // Ausgabe der Daten des Array
 // jetzt nach from und until suchen

$pos = strpos("from", $werte); 
$pos1 = strpos("until", $werte);

// jetzt müssen aus dem String die Werte selectiert werden
//  $calendar[1]['dates'][0]['from'] = 25.08.2007;
//  $calendar[1]['dates'][0]['until'] = 09.09.2007;


// Datum definieren
$today = date("dmY"); 

// wenn gefunden dann....
if ($pos == true and $pos > $today) {
  
//


// hier ist noch einiges falsch
$value = substr($pos, $pos, 10);  // Ausgabe der Daten  
$value2 = substr($pos1, $pos1, 10);  // Ausgabe der Daten  

      echo "<p>".$value."-".$value2."</p>";

  }
  }
?>

</body>
</html>

16.11.2007 23:44

4 Jörg Kruse

Mir ist immer noch nicht klar, wo du das Array $werte her nimmst.

Ich würde ganz einfach $calendar[1]['dates'] in die Schleife packen - um darauf zuzugreifen, musst du nur oberhalb die Datei daten.hp includieren

include ("daten.php");

foreach ($calendar[1]['dates'] as $dates) {
    /* weiter ... */
}

Innerhalb der Schleife überprüfst du, ob das betreffende Array-Feld belegt ist:

    if (isset($dates['from'])) {
        /* weiter ... */
    }

Darin wiederum wandelst du den Datumsstring um in einen Timestamp, den du mit time() vergleichst:

 
        $time = explode('.', $dates['from']);
        $timestamp = mktime(0, 0, 0, $time[1], $time[0], $time[2]);
        if ($timestamp > time()) {
            echo "<p>" . $dates['from'] . " - " . $dates['until'] . "</p>";
        }

17.11.2007 00:32 | geändert: 17.11.2007 00:35

5 uwe

Hallo Jörg,
danke, aber es wird nur ein Wert angezeigt.


Jetzt sieht man nur den letzten
17.05.2008 - 31.05.2008
Es sollen alle Daten die größer sind als heute angezeigt werden.




Gruss
Uwe

17.11.2007 00:54

6 Jörg Kruse

Wenn ich die Seite mit den von mir beschriebenen Code aufrufe, erhalte ich folgende Ausgabe:

15.03.2008 - 29.03.2008

20.04.2008 - 26.04.2008

17.05.2008 - 31.05.2008

Überprüf noch mal die Abläufe, wie ich sie beschrieben habe: außen die Schleife, darin die erste if-Anweisung, darin dei zweite...

17.11.2007 01:02 | geändert: 17.11.2007 01:04

7 uwe

Hallo Jörg,
hab die Schleife falsch gesetzt

--- alles klar besten Dank----


Gruss
Uwe

17.11.2007 01:15

8 uwe

Hallo Jörg,
die Lösung
<?php
include ("verwaltung/daten.inc.php");

foreach ($calendar[1]['dates'] as $dates) {
   if (isset($dates['until'])) {
        $time = explode('.', $dates['until']);
       $timestamp = mktime(0, 0, 0, $time[1], $time[0], $time[2]);
       if ($timestamp > time()) {
           echo "<p> vom " . $dates['from'] . " bis " . $dates['until'] . " belegt/ausgebucht"."</p>";
       }
   }
}

?>
funktioniert klasse.

Jetzt will ich eine automatische Berechnung zum nächsten freien Termin umsetzen.

der Belegungsplan sieht so aus
30.11.2007 - 10.12.2007
30.12.2007 - 06.01.2008
.....

Also angenommen wir haben heute den 18.11.2007
dann wäre die Berechnung

18.11.2007 bis 30.11.2007=
Anzeige:
von heute() bis zum 30.11.2007 frei.

Angenommen wir haben den 01.12.2007
dann wäre die Anzeige:
vom 10.12.2007 bis 30.12.2007 ist frei

Wie berechnet man das?

Gruss
Uwe

18.11.2007 12:40

9 Jörg Kruse

1. du holst alle Datensätze in einer Schleife aus dem Array

2. du wandelst alle Datumstrings um in Timestamp-Werte

3. du ziehst von allen 'until' Werten time() ab und wählst den Datensatz mit dem niedrigsten positiven Ergebnis aus

4. Von diesem Datensatz vergleichst du den 'from' Wert mit time(). Wenn ersterer höher ist, fahre fort mit 5., andernfalls mit 6.

5. Beginn der freien Zeit ist heute, Ende der 'from' Wert des betreffenden Datensatzes

6. ausgehend von 3., wähle als zweiten Datensatz denjenigen mit dem zweitniedrigsten positiven Ergebnis aus

7. Beginn der freien Zeit ist der 'until' Wert des ersten Datensatzes, Ende der 'from' Wert des zweiten Datensatzes

18.11.2007 16:04

10 uwe

Hallo,
ich habe mal angefangen:


habe aber gleich eine Fehlermeldung:
//Parse error: syntax error, unexpected T_FOREACH in /home/www/s001w22/html/test/belegungarray.php on line 13

<html>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<head>
<title>Belegung</title>
</head>
<body>

<?php
include ("daten.php");
 
$i=0

foreach ($calendar[1]['dates'] as $dates) {
   if (isset($dates['from'])) {
        $time = explode('.', $dates['from']);
       $timestamp = mktime(0, 0, 0, $time[1], $time[0], $time[2]);
       if ($timestamp > time()) {


     $von[$i]= . $dates['from'] .;
     $bis[$i]= . $dates['until'] .;

i=i+1


       }
   }
}
 


$datum1 = date("d.m.y", $von[0]); 
$datum2 = date("d.m.y", $bis[0]); 
$datum3 = date("d.m.y", $von[1]); 
$datum4 = date("d.m.y", $bis[1]); 
     

// ich brauche nur die ersten 4 Variablen für die weitere Berechnung
print $datum1;
print $datum2;
print $datum3;
print $datum4;



?>
</body>
</html>

20.11.2007 19:56