CSV-Datei in PHP sortieren

Kalito

Erfahrenes Mitglied
Hallo,

ich habe eine CSV-Datei, die ich mittels php in Html anzeigen möchte. Soweit funktioniert alles, außer zwei Sachen.

1. Die ganze Tabelle soll nach dem Preis sortiert werden?
2. Wie kann man die Größe der Tabelle einstellen?

Hier der Quellcode:

PHP:
<?php

    $handle = fopen('webgains_datenfeed.csv', 'r');

    $zeilen = array();
    $aktuelleZeile = 0;

    while($data = fgetcsv($handle, 1500, ';'))
    {
      $zeilen[$aktuelleZeile] = $data;
      $aktuelleZeile++;
    }
    fclose($handle);

    function sort_data($int) {
      $zeilen_bkp = $zeilen;
    }



   echo "<table border=1>";
    echo "<tr>";
        echo "<th >".Produkt."</th>";
        echo "<th>".Name."</th>";
        echo "<th>".Beschreibung."</th>";
        echo "<th>".Preis."</th>";
        echo "<th>".Portokosten."</th>";
    echo "</tr>";
    for($dl=1; $dl<count($zeilen); $dl++) {
        $data = $zeilen[$dl];
        echo "<tr>";
        echo "<td width=\"80px\" height=\"10px\"><img src=\"".$data[7]."\" /></td>";
        echo "<td width=\"80px\" height=\"10px\">".$data[3]."</td>";
        echo "<td width=\"80px\" height=\"10px\">".$data[4]."</td>";
        echo "<td width=\"80px\" height=\"10px\">".'arsort($data[6])'."</td>";
        echo "<td width=\"80px\" height=\"10px\">".$data[10]."</td>";
        echo "</tr>\n";
    }

    echo "</table>";
    arsort($data[6]);
?>
 
1. Schau dir dazu mal die Funktion usort() an, die sollte dir weiterhelfen.
2. Meinst du die Breite? Definiere die am besten in den <th>-Tags, so verhinderst du auch ein bisschen overhead, weil du es nicht in jedes einzele <td> rein schreibst.
 
Hallo Kalito.

ich hab es mal so gebaut wie ich es meistens löse. wie von Tim bereits erwähnt verwende ich hier usort.

PHP:
<?php
function cmpByPrice($left, $right)
{
  if ($left->price > $right->price)
  {
    return 1;
  }
  elseif ($left->price < $right->price)
  {
    return -1;
  }
  return 0;
}

// Datei öffnen.
$handle = fopen('webgains_datenfeed.csv', 'r'); 
$zeilen = array(); 

$aktuelleZeile = 0; 
while($data = fgetcsv($handle, 1500, ';')) 
{
  $obj = new stdClass;
  $obj->product = $data[7];
  $obj->name = $data[3];
  $obj->descr = $data[4];
  $obj->price = $data[6];
  $obj->porto = $data[10];
  
  $zeilen[$aktuelleZeile] = $obj;
  $aktuelleZeile++; 
} 
fclose($handle);

// Sortieren.
usort($zeilen, "cmpByPrice");

// Ausgabe.
echo "<table border=1>"; 
echo "<tr>"; 
echo "<th >".Produkt."</th>"; 
echo "<th>".Name."</th>"; 
echo "<th>".Beschreibung."</th>"; 
echo "<th>".Preis."</th>"; 
echo "<th>".Portokosten."</th>"; 
echo "</tr>"; 
for ($dl=1; $dl<count($zeilen); $dl++) { 
  $data = $zeilen[$dl]; 
  echo "<tr>"; 
  echo "<td width=\"80px\" height=\"10px\"><img src=\"".$data->product."\" /></td>"; 
  echo "<td width=\"80px\" height=\"10px\">".$data->name."</td>"; 
  echo "<td width=\"80px\" height=\"10px\">".$data->descr."</td>"; 
  echo "<td width=\"80px\" height=\"10px\">".$data->price."</td>"; 
  echo "<td width=\"80px\" height=\"10px\">".$data->porto."</td>"; 
  echo "</tr>\n"; 
}
echo "</table>"; 
?>
Antwort    Zitieren      Danke

Zuerst lese ich die Daten in einen Array mit Objekten um diesen dann anschließend per usort() und der Funktion cmpByPrice einfach zu sortieren.
 
für die Breite würde ich width im header und nicht in den Details definieren
HTML:
<table>
	<tr>
		<th width="80px" height="10px">SpaltenHeader1</th>
		<th width="80px">SpaltenHeader2</th>
		<th>SpaltenHeader3</th>
	<tr>
	<tr>
		<td height="10px">Zeile1_Spalte1</td>
		<td>Zeile1_Spalte2</td>
		<td>Zeile1_Spalte3</td>
	<tr>	
	<tr>
		<td height="10px">Zeile2_Spalte1</td>
		<td>Zeile2_Spalte2</td>
		<td>Zeile2_Spalte3</td>
	<tr>	
</table>


Lies auch mal den ganzen Abschnitt http://de.selfhtml.org/html/tabellen/gestaltung.htm#breiten_hoehen
Die Angaben zu Breite und Höhe sind nur wirksam, wenn der Tabellen- bzw. Zelleninhalt kleiner ist, sodass leerer Raum entsteht. Wenn der Tabelleninhalt größer ist, werden die Angaben zu Breite und Höhe außer Kraft gesetzt.
 
Danke

Jetzt hab ich aber ein neues Problem.

Durch die Sortierung ist der Tabellenkopf mit den Spaltennamen der csv ganz unten aufgetaucht. Wie kann ich diese loswerden? Ich hatte es mit einer if Schleife probiert, die die csv erst ab der zweiten Zeile einliest, aber hat nicht funktioniert.

Danke


Gruß, Patrick
 
Die erste Zeile rausnehmen -> sortieren -> Zeile am Anfang wieder einfügen (ggf nicht nötig)
PHP:
$header = array_shift($zeilen);
usort($zeilen, "cmpByPrice");
array_unshift($zeilen, $header);
 
Danke :)

Bei soviel Hilfe werde ich mich heute oder morgen mal schauen, ob ich armen Seelen wie mir auch helfen kann
 
Zurück