2017-12-21 5 views
-5

lese ich eine Textdatei Daten genannt, die Wie kann ich diese Textverarbeitung in PHP beenden?

# 
# data formatted as 
# 
# email_address:number_of_orders:total_order_value 
# 

         # This is dummy data 

[email protected]:7:8.35 
[email protected]:4:5.59 
[email protected]:3:9.29 
[email protected]:4:6.67 
[email protected]:8:22.84 
[email protected]:7:14.80 

[email protected]:6:8.36 
[email protected]:5:18.67 
[email protected]:5:22.88 
[email protected]:10:18.68 
[email protected]:2:19.67 
[email protected]:5:21.89 

# end of data 

ich diese Datei lesen möchten, wie

aussieht und erzeugen die Ausgabe HTML-Tabellen die wie

+-----------------------------------------------+ 
|      able.com     | 
+---------------+------------------+------------+ 
| [email protected] |   1  |  20.30 | 
| [email protected] |   4  |  5.05 | 
+---------------+------------------+------------+ 
|      bodge.com     | 
+---------------+------------------+------------+ 
| [email protected] |   3  |  132.20 | 
+---------------+------------------+------------+ 

Die Ausgabe sieht mit sollte in aufsteigender alphabetischer Reihenfolge der Domain sein, dh able.com, bodge.com, gmx.net usw., und für jede Domain sollten die Bestellungsdetails in aufsteigender alphabetischer Reihenfolge der Email-Adresse aufgelistet werden.

Dies muss mit PHP OO-Prinzipien geschehen, so dass es zuerst die Daten in eine Datenstruktur liest und dann die Daten an eine Funktion/Methode übergibt, die die formatierte Ausgabe erzeugt.

Die an die Funktion übergebenen Daten sollten ein assoziatives Array sein, das mit dem Domänennamen codiert ist. (z. B. $ orders ['able.com'] wären die Bestelldaten für Domäne 'able.com'). Jedes Element des Domänen-Arrays sollte ein Array von Bestelldaten für diese Domäne sein. Jedes Element der Auftragsdaten sollte eine Instanz einer Klasse sein, die Details zu diesem Datensatz enthält.

Die Ausgabe sollte nach Domänennamen und für jede Domäne per E-Mail Adresse sortiert werden.

Und bisher habe ich nur das getan.

<?php 
    $fp = fopen('./data', 'r'); 

    while(!feof($fp)) //file pointer 
    { 
     $data = fgetc($fp); //read file char by char 
     if($data == '#' || $data == ' ') 
     { 
      $line = fgets($fp); //ignore line if $data = # or ' ' 
      continue; 
     } 
     else 
     { 
      do 
      { 
       $line = fgets($fp); //pick one line which not started with # or not an empty line 
       $order = explode(':', $line); 

      }while($data == '\n'); 


      $email = explode('@', $order[0]); 

      $user = $email[0]; 

      echo "<strong>Email,&nbsp;&nbsp;"; 

      echo "Number of orders,&nbsp;&nbsp;Value</strong><br />"; 

      foreach($order as $key => $val) 
      { 
       echo $val; 

       echo "<br />"; 
      } 
      echo "<br />"; 
     } 
    } 
    fclose($fp); 

Ich bin sicher, das ist nicht der richtige Weg, es zu tun. Kann jemand irgendwelche Hinweise geben, um richtig vorzugehen?

+1

Bevor jemand Ihnen sagt, dass Sie keine Daten in einer Textdatei speichern sollen, gibt es einen Grund, akademisch oder anders, warum Sie Daten in einer Textdatei speichern müssen/müssen? –

+0

@WilliamPerron es ist offensichtlich, dass "OP" keine Kenntnis von "SQL" und ist Anfänger, so verwendet. Text-Dateien als Speicher. –

+0

@GiulioBambini Ich möchte keine Annahmen treffen. Viele Tutorials springen ziemlich früh in MySQL-Datenbanken ein und es gibt möglicherweise Anforderungen/Einschränkungen, die uns nicht bekannt sind. –

Antwort

1

Wenn ich richtig verstehe, müssen Sie das mit OOP tun, richtig? In diesem Fall haben Sie es wie folgt aus:

class RecordItem { 
    public $email; 
    public $number; 
    public $value; 

    function __construct($email, $number, $value) { 
     $this->email = $email; 
     $this->number = $number; 
     $this->value = $value; 
    } 
} 

class Orders { 
    private $records = []; 

    public function Read($fileName) { 
     $lines = file($fileName, FILE_IGNORE_NEW_LINES & FILE_SKIP_EMPTY_LINES); 

     foreach($lines as $_line) { 
      if(false !== stripos($_line, '@') && false !== stripos($_line, ':')) { 
       $_order = explode(':', $_line); 
       $_email = explode('@', $_order[0]); 
       $this->records[$_email[1]][] = new RecordItem($_order[0], $_order[1], $_order[2]); 
      } 
     } 
    } 


    public function Display() { 
     ksort($this->records); 
     echo '<table border="1">'; 
     foreach($this->records as $domain => $records) { 
      echo '<tr><td colspan="3">' . $domain . '</td></tr>'; 
      usort($records, function($a, $b) { return strcmp($a->email, $b->email); }); 
      foreach($records as $record) { 
       echo '<tr>'; 
       echo '<td>' . $record->email . '</td>'; 
       echo '<td>' . $record->number . '</td>'; 
       echo '<td>' . $record->value . '</td>'; 
       echo '</tr>'; 
      } 
     } 
     echo '</table>'; 
    } 
} 

$orders = new Orders(); 

$orders->Read('test.txt'); 
$orders->Display(); 

Für die Zukunft PHP liefert eine viele Funktionen und Klassen, die eine Menge guter Arbeit tun, und Sie brauchen nicht, es zu schreiben. Schauen Sie sich die Beispiele im Web an, es gibt viele davon. Und benutzen Sie die PHP Manual Site, dort finden Sie Beschreibungen und Beispiele für PHP Funktionen und Klassen.

+0

Vielen Dank. Ich schätze deine Hilfe sehr. – php12345