[PHP] Array sortieren

tobias1985

Der Erlöser
ID: 37913
L
24 April 2006
4.963
607
Hi,
erstmal der Code damit ihr wisst was ich meine:

PHP:
$lines = file ($logfile);
$x = 0;
foreach ($lines as $line_num => $line){
$teile = explode(" - ", $line);
if(count($teile) == 7){
$array[$x] = array($teile[0], $teile[1], $teile[2], $teile[3], $teile[4], $teile[5], $teile[6]);
$x++;
}
}
$anzahl_eintraege = count($array);
$y = 0;
while($y < $anzahl_eintraege){
$browser = browser($array[$y][2]);
$platform = platform($array[$y][2]);
echo 'Datum/Uhrzeit: '.$array[$y][0].'<br>
IP/Host: '.$array[$y][1].'<br>
Browser/Betriebssystem: '.$array[$y][2].'<br>
Referer: '.$array[$y][3].'<br>
Request: '.$array[$y][4].'<br>
Grund: '.$array[$y][5].'<br>
Grund-Details: '.$array[$y][6]';
$y++;
}

Kurze Erklärung: Ich lese ein Logfile aus und gebe die entsprechenden Infos aus. Das HTML-Zeugs hab ich mal entfernt, damit der Code übersichtlicher ist.

Soweit funktioniert das ganze auch. Wie bekomme ich es nun aber hin, dass zum Beispiel nach "Grund" sortiert wird? (oder eben nach irgendwas anderes)
Irgendwie fällt mir dazu keine Lösung ein. Die Sortierfunktionen von Arrays kenne ich, weiß aber nicht wie ich die darauf anwenden soll, dass es richtig funktioniert.
Ich hoffe ihr könnt mir helfen. Danke schonmal!
 
Hm so wirklich sortieren tut er aber nicht:

PHP:
$sort = 5;
function cmp($a, $b) {
   return strcmp($a[$sort], $b[$sort]);
}
$lines = file ($logfile);
$x = 0;
foreach ($lines as $line_num => $line){
$teile = explode(" - ", $line);
if(count($teile) == 7){
$array[$x] = array($teile[0], $teile[1], $teile[2], $teile[3], $teile[4], $teile[5], $teile[6]);
$x++;
}
}
$anzahl_eintraege = count($array);
usort($array, "cmp");
while (list ($key, $value) = each($array)) {
$browser = browser($array[$key][2]);
$platform = platform($array[$key][2]);
echo 'Datum/Uhrzeit: '.$array[$key][0].'<br>
IP/Host: '.$array[$key][1].'<br>
Browser/Betriebssystem: '.$array[$key][2].'<br>
Referer: '.$array[$key][3].'<br>
Request: '.$array[$key][4].'<br>
Grund: '.$array[$key][5].'<br>
Grund-Details: '.$array[$key][6]';
}

Die Ausgabe bleibt immer gleich, egal was ich in $sort reinschreibe. (0-6) Und sortiert ist es auch nicht. Sortiere ich nach dem Array 5, sollte er ja nach dem Grund sortieren. (ip, ip-range, ua) Aber trotzdem ist die Ausgabe durcheinander. (ip,ip,ip,ua,ip-range,ip,ua......)
 
$sort ist innerhalb von cmp() ja auch unbekannt, da Du es ausserhalb der Funktion definierst und nicht per global in die Funktion reinholst.
 
Hilfe komme nicht weiter

Hi Leute

Ich hab soeben das Forum nach einer (für mich) funktionierenden Sortierfunktion durchsucht und bin zu keinem zufrieden stellenden Ergebniss gekommen. Das bisher beste Ergebniss habe ich mit der usort Funktion erreicht.

Ich Versuche Daten eines Mehrdimmensionalen Arrays zu sortieren. Das sich wie folgt zusammensetzt

$daten[$z][name]
$daten[$z][nname]
$daten[$z][punkte]

Die Variable $z steht für die Datensatz nummer. Jetzt möchte ich diese Daten nach der Punktzahl in absteigender Reihenfolge sortieren und ausgeben.

Bisher hab ichs nur aufsteigend hinbekommen aber dabei het es mir auch immer das letzte Element in der Liste gelöscht. (Ich hoffe ihr könnt mir folgen)

Hier mein Script:
PHP:
function cmp($a, $b) {
   return strcmp($a["punkte"], $b["punkte"]);
}
  
usort($daten, "cmp");


  $z=1;                            //Zeilenzahlangabe
  $num = count ($daten);           //Zählen der Arrays für Schleifenwiederholung
  
  for ($c=0; $c < $num; $c++) {      //FOR-Schleife zum füllen der Zeilen
  
  
  echo                            //Ausgabe der Reihen
  "<tr>
    <td width=\"70\">" . $daten[$z][punkte] . "</td>
    <td width=\"60\">" . $z . "</td>
    <td width=\"95\">" . $daten[$z][nname] . "</td>
    <td width=\"105\">" . $daten[$z][name] . "</td>
    <td>" . $daten[$z][gruppe] . "</td>
  </tr>";
  
  $z++;                          //Aufaddierung der Zeilenangabe
  }                              //Ende der Schleife bzw. Neustart

So vielleicht könnt ihr mir da ja weiterhelfen.

Gruß Stefan
 
Naja, das mit dem Sortieren ist ganz einfach. Du musst innerhalb der Vergleichsfunktion ja keine String vergleichen, sondern kannst die beiden Werte direkt mit > oder < vergleichen. Guck Dir am besten mal die Doku zu usort() an, da ist bestimmt ein Beispiel dabei.

Und das mit dem fehlenden Eintrag (ist übrigens der erste Eintrag der fehlt, nicht der letzte) liegt daran, dass Du $z mit 1 initialisierst und dann hochzählst. Ein Array fängt aber bei 0 an. Ich frag mich eh, wieso $z nutzst und nicht $c, was ja viel einfacher wäre...
 
Hups da is mir doch das Z zuoft reingerutscht *g* OK mein Fehler. Das Z soll eigentlich nur die Rang inkrementierung sein, da die ja im selben Loop immer 1 höher ist als C.

Jetzt Sortiert auch mein Script ganz toll nur leider immer noch verkehrt herum und er sieht den Punktestand als string und nicht als integer.

Vielleicht könnte mir jemand die richtige cmp function zukommen lassen, ich glaub ich seh einfach meinen Fehler nicht (oder besser gesagt ich find keine Möglichkeit es umgekehrt zu sortieren) Vielleicht hab ich einfach heute schon zuviel gecodet. :yawn:

Gruß Ullix
 
Jetzt Sortiert auch mein Script ganz toll nur leider immer noch verkehrt herum und er sieht den Punktestand als string und nicht als integer.

Les dir einfach mal durch, was strcmp() zurückgibt. Du musst nur das Gleiche für Ints machen (und ggf. die Rückgabewerte umdrehen, wenn es falsch rum sortiert).
 
Wenn ich mich recht entsinne, konnte man bei Integerzahlen auch einfach die beiden subtrahieren, um so auf >0 / =0 / <0 zu kommen.

[edit]

Das erste Beispiel in der Doku behandelt doch Zahlen. :roll: