PHP 4.3

10.12 Erweiterung des csv-Beispiels

Sie kennen jetzt die übliche Herangehensweise an das Lesen und Schreiben von csv-Daten. In Hinblick auf die praktische Einsetzbarkeit unseres Beispiels möchten wir die Flexibilität beider Funktionen noch erweitern. Am Beispiel der Produkte ist die Notwendigkeit einer Kategorienaufteilung offensichtlich. Zum einen soll eine Liste von Produkten eine thematische Ordnung bekommen, zum anderen macht es bei einer größeren Produktsammlung auch Sinn, den Arbeitsspeicher des Servers sowie den PHP-Prozessor zu entlasten, indem er nur jene Daten ausliest, die für uns bzw. den Besucher im Moment tatsächlich interessant sind.

Wenn Sie eine Produktsammlung nach dem oben vorgeschlagenen Schema angelegt haben, sollte es Ihnen nicht schwer fallen, eine gleichermaßen sinnvolle wie einfache Unterteilung in Kategorien zu finden.

In unserem Beispiel unterteilen wir die Produkte anhand ihrer Produktnummer in verschiedene Produktkategorien, die jeweils 1000 Produkte enthalten können. So beginnt die Produktkategorie "Obst" mit der Produktnummer 0 und endet mit der Produktnummer 999. "Gemüse" fängt bei 1000 an und endet bei 1999 usw. Auf diesem Wege können wir beim Auslesen der Daten einen Filter auf die Produkte setzen, deren erster Arrayeintrag - die Produktnummer - im gewünschten Bereich liegt.

Es ist sinnvoll, zur Verwaltung der Produktkategorien eine weitere Datei anzulegen, welche die erste Produktnummer einer Produktkategorie zusammen mit seiner Bezeichnung enthält. Im unteren Screenshot sehen Sie die Datei produkt_kategorie.txt, in der eine solche Struktur beispielhaft angelegt wurde. Wundern Sie sich nicht, dass jeweils nur die erste Produktnummer einer Produktkategorie angegeben wurde. Gemäß der Vereinbarung, dass jede Produktkategorie maximal 1000 Produkte enthalten soll, können wir das Ende jeder Kategorie durch den Anfangswert + 999 eindeutig bestimmen.

Für das Auslesen einer bestimmten Produktkategorie definieren wir eine Funktion lies_produkte(), die ihrerseits unsere Funktion read_csv() verwendet. Die Funktion lies_produkte() liefert ein Array zurück, das nur die Produkte einer Kategorie enthält. Dazu erwartet Sie im Parameter $kat die erste Nummer des für die gewünschte Kategorie festgelegten Produktnummernbereichs. Nach dem Auslesen der Datei produkte.txt mit der Funktion read_csv() werden anhand dieses Parameters und der bekannten Größe des Nummernbereichs (1000) alle Artikel dieser Kategorie aus dem Gesamtbestand herausgesucht und in einem Array zurückgegeben:

 function lies_produkte($kat) {
     //Produkte nach Kategorien auslesen
      $fp = @  fopen("produkte.txt", "r");
      if ($fp == false) {
       $fehler = "Datei nicht gefunden";
       } else {
         $zeile = read_csv($fp);
         fclose($fp);
         $j = 0;
         for ($i = 0; $i < count($zeile); $i++) {
          if ($zeile[$i][0] >= $kat && $zeile[$i][0] < $kat + 1000) {
             $produkte[$j] = $zeile[$i];
             $j++;
           }
         }
        }
         if ($fehler != "") {
           return $fehler;
          } else {
           return $produkte;
         }
      }

Vor dem Auslesen der Produkte mit read_csv() muss die Datei produkte.txt geöffnet werden. Schlägt das Öffnen der Datei fehl, wird eine Fehlermeldung in der Variablen $fehler abgelegt. Am Ende der Funktion wird anhand des Werts dieser Variablen festgestellt, ob ein Fehler aufgetreten ist. Wie Sie sehen, wird im Fehlerfall die in $fehler abgelegte Fehlermeldung zurückgegeben, anderenfalls das Array mit den gefundenen Produkten. Durch eine Überprüfung des Rückgabewerts der Funktion lies_produkte() mit is_array() kann also festgestellt werden, ob der Aufruf erfolgreich war.

Das folgende Beispiel zeigt das Einlesen aller Produkte der Kategorie "Gemüse" (Produktnummern 1000 bis 1999) mit Fehlererkennung:

 $produkte = lies_produkte(1000);   // Kategorie "Gemüse" einlesen
if (! is_array($produkte)) { echo $produkte . "<br>"; // Fehlermeldung ausgeben } else { // Hier kann mit der Produktliste gearbeitet werden
}

Kommentare (0)

Ihr Kommentar

Name