Sortierfunktion für Array

Extremniki

Erfahrenes Mitglied
So, hier gehts nun weiter. Habe dieses Thread eröffnet, weil während des Lösungsweges zu meinem alten Problem (http://www.tutorials.de/forum/showthread.php?threadid=24788) erst dieses hier auftrat.

Also:

Ich möchte eine Array so sortieren, dass die Einträge in der passenden Reihenfolge stehen. Die Elemente des Arrays heissen $eintrag[0], $eintrag[1]... usw.
Die Ausgabe sieht dann wie folgt aus:

01.10.2002 Veranstaltungsname, 33647 Veranstaltungsort
15.10.2002 Veranstaltungsname, 33587 Veranstaltungsort
usw.

Hier steht es jetzt in der Reihenfolge nach dem Datum, aber nur, weil ich das auch selbst in der Reihenfolge so reingeschrieben habe. Was aber, wenn ich jetzt einen neuen Termin eintrage, der am 12.10.2002 ist, also dazwischen? Bisher wird er am Ende unten eingefügt, dass will ich aber in Zukunft nicht mehr.

Da ich schon alle Tutorials und Forenbeiträge zu diesem Thema durch habe, mir auch die Doku bei php.net und andere lustige Webseiten nicht weiterhelfen (dafür bin ich glaub ich noch zu jung dabei), hoffe ich nun auf Hilfe von Euch. Es muss doch eine ganz simple Lösung geben, die z.B. lautet: sort = ($eintrag[1]); oder so (eintrag[1] ist das Datum im oben gezeigten Format, also 00.00.0000).

Mit Datenbanken kann ich hier nicht arbeiten, weil auf diesem Server ekin MySQL läuft und ich es ausserdem mit ner Textdatei hinbekommen möchte.

Ich danke schonmal im Vorraus, denn die Hilfe hier ist echt immer sehr zügig!

Gruß Nikolaj
 
Tja, ein einfaches sort() funktioniert hier ja leider nicht. Also müssen wir uns eine eigene Suchfunktion basteln. Großzügigerweise bietet uns da PHP schon eine Lösung an, bei der wir uns nicht um den Sortieralgorithmus, sondern nur noch um den Vergleich zweier Arrayfelder kümmern müssen. Wir müssen der Suchfunktion also mitteilen, ob ein bestimmter Eintrag vor oder hinter einem anderen stehen soll. Das sieht dann in deinem Fall z.B. so aus:

PHP:
<?
function sortiereNachDatum($a, $b)
{
  // strtok: gib den string bis zum ersten vorkommen von " "
  //         zurück (datum isolieren)
  // explode: zerteile diesen string in ein array, die einträge
  //          werden jeweils mit einem "." voneinander getrennt
  //          (datumsbestandteile rausfiltern)
  // list: weise den variablen $tag, $monat und $jahr die werte
  //       der arrayeinträge zu
  list($tag, $monat, $jahr) = explode(".", strtok($a, " "));
  // mktime: berechne die sekunden seit dem 01.01.1970 für das
  //         angegebene datum
  $datum1 = mktime(0, 0, 0, $monat, $tag, $jahr);

  // und jetzt dasselbe für das zweite datum
  list($tag, $monat, $jahr) = explode(".", strtok($b, " "));
  $datum2 = mktime(0, 0, 0, $monat, $tag, $jahr);

  if ($datum1 > $datum2) {
    return 1;
  } else if ($datum1 < $datum2) {
    return -1;
  } else {
    return 0;
  }
}

// zu ergänzen: einträge einlesen

// erster parameter: das zu sortierende array
// zweiter parameter: die vergleichsfunktion
usort($eintrag, "sortiereNachDatum");

// zu ergänzen: ausgabe
?>

HTH :)

// edit: Öhm, äh, hab mir aus reinem Interesse jetzt mal im Nachhinein noch den ursprünglichen Thread durchgelesen und festgestellt, dass das so wohl nicht ganz stimmt. Bin jetzt davon ausgegangen, dass $eintrag ein Array von vollständigen Datum-und-Ereignis-Strings ist. Wenn jetzt aber in $eintrag nur die Daten stehen, wie soll man dann die Assoziation zum jeweiligen Ereignis nach dem sortieren wiederherstellen? Bitte um Erläuterung deiner Datenstrukturen, dann kann ich auch die Suchfunktion entsprechend anpassen :)
 
Zuletzt bearbeitet:
@reima:

danke für deine ausführliche nachricht, hier schreibe ich dir jetzt mal das komplette scrip, was ich schon hab:

in der .txt stehen die einträge so:

MO|-|01.10.2002|-|Veranstaltungsart|-|33647 Veranstaltungsort|-|
DO|-|21.10.2002|-|Veranstaltungsart|-|33647 Veranstaltungsort|-|
MI|-|17.11.2002|-|Veranstaltungsart|-|33647 Veranstaltungsort|-|

usw.

das auslesende script lautet:
PHP:
<?
$log = "termine.txt";
$inhalt = file($log);
$anzahl = count($inhalt);
echo "<p>es sind bisher $anzahl Einträge im Kalender </p>"; 
$fp = fopen("termine.txt","r"); for ($i=0; $i<$anzahl; $i++) 
{   
$inhalt = fgets($fp);   
$eintrag = explode("|-|",$inhalt); 

echo $eintrag[0]; //Wochentag
echo $eintrag[1]; //Datum
echo $eintrag[2]; //Veranstaltungsart
echo $eintrag[3]; //Veranstaltungsort
}
?>

die echo's $eintrag[x] sind im richtigen script noch in einer tabelle verpackt, das habe ich jetzt mal der übersichtlichkeit weggelassen.

nun sollen also die einträge nach $eintrag[1] sortiert werden.
vielleicht hilft dir das jetzt weiter.

gruß nikolaj
 
Ja, sehr sogar :)

Erstens mal wird mit file() sowieso schon die gesamte Datei ausgelesen. Also kann man das ganze noch etwas vereinfachen.


PHP:
<?
function sortiereNachDatum($a, $b)
{
  list($tag, $monat, $jahr) = explode(".", $a[1]);
  $datum1 = mktime(0, 0, 0, $monat, $tag, $jahr);

  list($tag, $monat, $jahr) = explode(".", $b[1]);
  $datum2 = mktime(0, 0, 0, $monat, $tag, $jahr);

  // kurzschreibweise, ausführlicher in meinem letzen beitrag
  if ($datum1==$datum2) return 0;
  else return ($datum1>$datum2)?1:-1;
}


$log = "termine.txt";
$inhalt = file($log);

// durchlaufe jede zeile...
foreach ($inhalt as $zeile) {
  $eintrag[] = explode("|-|", $zeile);
}

// sortieren
usort($eintrag, "sortiereNachDatum");

// ausgabe
foreach ($eintrag as $e) {
  echo $e[0];
  echo $e[1];
  echo $e[2];
  echo $e[3];  
}
?>
 
@reima:

hey, danke, du bist der held!!!!! es funzt!
werde dieses beispiel zum lernen nutzen, vielen dank dir nochmal.

schönen abend!

gruß nikolaj
 
danke @farion, auch deinen tip nehme ich mir zu herzen.

ich bin ja wie schon erwähnt blutiger anfänger im bereich php. ausser dem echo-befehl ist mir noch nichts wirklich logisch:-) , aber ich arbeite daran und kann mit hilfe eurer postings schon viel davon verstehen.

nichts desto trotz werde ich mir ein buch über php zu weihnachten wünschen und kann dann hoffentlich auch anderen hilfestellungen hier geben.

schönen abend noch,
nikolaj
 
Zurück