PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Strings sortieren


Heppi
03.12.2004, 18:13:42
Hallo zusammen,

ich habe ein Array gefüllt mit Strings. Ich möchte dieses Array nun alphabetisch sortieren, aber es ändert sich nichts. Hab hier mal einen Auszug aus dem Code.

for($i = 0;$i < sizeof($sportarten);$i++)
echo($sportarten[$i].'<br>');

echo('<br>');

sort($sportarten);

for($i = 0;$i < sizeof($sportarten);$i++)
echo($sportarten[$i].'<br>');

Allerdings wird da nichts sortiert. Was mache ich denn da falsch?

Danke für eure Hilfe!

Grüße, Heppi.

xabbuh
03.12.2004, 19:02:02
Dann zeig mal die Ausgabe vor und nach der Sortierung.

Heppi
03.12.2004, 19:03:16
Original geschrieben von xabbuh
Dann zeig mal die Ausgabe vor und nach der Sortierung.

Aerobic
Alpinski
Beach-Volleyball
Badminton
Basketball
Boxen
Budo
Eltern-Kind-Turnen
Faustball
Federball
Fit mit Musik
Gymnastik
Handball
Inline-Skating
Judo
Jiu Jitsu
Kinderturnen
Langlauf
Lauftreff
Leichtathletik
Mountainbiking
Prellball
Radtreff
Robe Skipping
Schwimmen
Snowboarden
Spielmannszug
Streetball
Step-Aerobic
Tischtennis
Turnen
Versehrtensport
Vorschulturnen
Volleyball
Walking
lll

Aerobic
Alpinski
Beach-Volleyball
Badminton
Basketball
Boxen
Budo
Eltern-Kind-Turnen
Faustball
Federball
Fit mit Musik
Gymnastik
Handball
Inline-Skating
Judo
Jiu Jitsu
Kinderturnen
Langlauf
Lauftreff
Leichtathletik
Mountainbiking
Prellball
Radtreff
Robe Skipping
Schwimmen
Snowboarden
Spielmannszug
Streetball
Step-Aerobic
Tischtennis
Turnen
Versehrtensport
Vorschulturnen
Volleyball
Walking
lll

Hab einfach mal versucht 'lll' einzufügen. (Sollen drei 'l' wie Ludwig sein.)

Jacki
03.12.2004, 19:06:41
ich nehem an, dass wenn das erste l von lll gross ist, geht es!
Nur wird er sich nach ASCII sortieren (vermutung) und da kommen die großbuchstaben vor den klein buchstaben!

Heppi
03.12.2004, 19:12:09
Original geschrieben von Jacki
ich nehem an, dass wenn das erste l von lll gross ist, geht es!
Nur wird er sich nach ASCII sortieren (vermutung) und da kommen die großbuchstaben vor den klein buchstaben!

Stimmt. Mit einem großen 'L' funktioniert es.
Weiß jemand ob es Funktionen gibt, die nach dem Alphabet sortieren?

xabbuh
03.12.2004, 19:23:24
natcasesort() (http://www.php.net/natcasesort) war das

Heppi
03.12.2004, 19:26:48
Original geschrieben von xabbuh
natcasesort() (http://www.php.net/natcasesort) war das

Funktioniert leider nicht :-(

xabbuh
03.12.2004, 21:37:17
Dann zeig mal, wie du es gemacht hast. Bei mir funktioniert die Funktion tadellos.

Jacki
03.12.2004, 21:42:48
tipp: ich würde jden string noch durch ein rtrim durchlaufen lassen.
sonst hast du weider verfälschte ergebnisse, da das leerzeichen dazuzählt....

xabbuh
04.12.2004, 11:48:46
Original geschrieben von Jacki
tipp: ich würde jden string noch durch ein rtrim durchlaufen lassen.
sonst hast du weider verfälschte ergebnisse, da das leerzeichen dazuzählt....
rtrim() (http://www.php.net/rtrim) entfernt aber nur die Leerzeichen am Ende. Insofern ist ltrim() (http://www.php.net/ltrim) (vom Anfang) oder trim() (http://www.php.net/trim) (von Anfang und Ende) besser.

Jacki
04.12.2004, 12:22:54
ltrim, hab nur right & left verwechselt *g*

Heppi
04.12.2004, 13:29:49
Original geschrieben von xabbuh
Dann zeig mal, wie du es gemacht hast. Bei mir funktioniert die Funktion tadellos.

Hab das einfach folendermaßen gemacht:
natcasesort($sportarten);
In $sportarten stecken die einzelnen Strings.

xabbuh
04.12.2004, 16:58:49
Das sollte auch funktionieren. Hast du mal den Tipp von Jacki angewandt?

Heppi
04.12.2004, 17:57:00
Original geschrieben von xabbuh
Das sollte auch funktionieren. Hast du mal den Tipp von Jacki angewandt?

Nee, hab ich nicht. Aberr ich hab da definitiv keine Leerzeichen drin.

Der Server sieht folgendermaßen aus.
http://www.alexander-hepp.de/phpinfo.php

Heppi
04.12.2004, 18:46:39
Hab grad noch weiterprobiert.
Nichr mal natsort funktioniert.

xabbuh
04.12.2004, 19:57:34
Original geschrieben von Heppi
Nee, hab ich nicht. Aberr ich hab da definitiv keine Leerzeichen drin.
Wenn du das nicht mal ausprobierst, wird man dir nur schwer helfen können.
Auf jeden Fall sollte natcasesort funktionieren.
Sonst stell halt mal ein Beispiel mit Daten hier rein.

Heppi
05.12.2004, 16:13:07
Sonst stell halt mal ein Beispiel mit Daten hier rein.

Was bracuhst Du da konkrekt?
Oben stehen doch die Daten (es sind 100%-ig sicher keine Leerzeichen drin) und der dazugehörige Code.

xabbuh
05.12.2004, 20:30:24
Die Art und Weise, wie du die Daten in dem Array speicherst und dann auch den Code der Sortierung.

Heppi
05.12.2004, 22:15:18
Original geschrieben von xabbuh
Die Art und Weise, wie du die Daten in dem Array speicherst und dann auch den Code der Sortierung.

Ich habe ein Text-File ($datafile), in dem die einzelnen Strings mit einem Trennzeichen getrennt eingetragen sind. In der for-Schleife speichere ich diese in das Array $sportarten. Anschließend hänge ich eine neue Sportart an, welche in $sportart als String (ohne Leerzeichen) steht. Dann versuche ich das ganze mit natcasesort() zu sortieren und anschließend wieder auszugeben.
Meine hinzugefügte Sportart steht aber immer am Ende des Arrays.

$inhalt = implode('', file($datafile));
$inhalt1 = explode('|||||', $inhalt);

for($i = 0;$i < sizeof($inhalt1);$i++)
$sportarten[$i] = $inhalt1[$i];

$sportarten[sizeof($inhalt1)] = $sportart;

natcasesort($sportarten);

for($i = 0;$i < sizeof($sportarten);$i++)
echo($sportarten[$i].'<br>');

Wäre super, wenn ihr mir da irgendwie helfen könntet.

Grüße, Heppi.

xabbuh
05.12.2004, 22:29:24
Original geschrieben von Heppi

$inhalt = implode('', file($datafile));
$inhalt1 = explode('|||||', $inhalt);

Da haben wir ja schon die überflüssigen Leerzeichen. Zeilen in Dateien sind je nach System durch n (Linux) bzw. rn (Windows) getrennt. Diese werden auch nicht von file() entfernt.

Ändere die for-Schleife so ab und es sollte funktionieren:

for($i = 0;$i < sizeof($inhalt1);$i++)
$sportarten[$i] = trim($inhalt1[$i]);

Heppi
06.12.2004, 16:37:16
Original geschrieben von xabbuh
Da haben wir ja schon die überflüssigen Leerzeichen. Zeilen in Dateien sind je nach System durch n (Linux) bzw. rn (Windows) getrennt. Diese werden auch nicht von file() entfernt.

Ändere die for-Schleife so ab und es sollte funktionieren:

for($i = 0;$i < sizeof($inhalt1);$i++)
$sportarten[$i] = trim($inhalt1[$i]);


Funktioniert nicht.
Die Daten stehen alle in einer Zeile.

xabbuh
06.12.2004, 16:39:51
Original geschrieben von Heppi
Funktioniert nicht.
Die Daten stehen alle in einer Zeile.
Hast du es ausprobiert?

Heppi
06.12.2004, 16:47:56
Original geschrieben von xabbuh
Hast du es ausprobiert?

Ja.

xabbuh
06.12.2004, 16:54:17
Dann stell die Datei mal zur Verfügung damit man das testen kann.

Heppi
06.12.2004, 17:05:41
Original geschrieben von xabbuh
Dann stell die Datei mal zur Verfügung damit man das testen kann.

OK, hab die mal hier hochgeladen:
http://www.alexander-hepp.de/sportarten.dat

xabbuh
06.12.2004, 17:18:49
Und was passt da nicht? Mit dem Script, dass du geschrieben hast, erhalte ich diese Ausgabe (http://nopaste.php-q.net/100893).

Heppi
06.12.2004, 17:22:13
Original geschrieben von xabbuh
Und was passt da nicht? Mit dem Script, dass du geschrieben hast, erhalte ich diese Ausgabe (http://nopaste.php-q.net/100893).

Die, die ja jetzt ausgegeben werden, waren ja auch schon alphabetisch sortiert. Wenn ich da jetzt allerdings hinten 'mmm' anhänge, funktioniert's nicht mehr.
Hab das File auf meinem Webspace mal aktualisiert und hinten 'mmm' angehängt.

xabbuh
06.12.2004, 17:29:44
Die folgende Zeile kannst du löschen:

$sportarten[sizeof($inhalt1)] = $sportart;


Und die Ausgabe muss mittels einer foreach- statt mit einer for-Schleife erfolgen, da bei natcasesort die Beziehung zwischen Schlüssel und Wert erhalten bleibt:

<?php
$inhalt = implode('', file($datafile));
$inhalt1 = explode('|||||', $inhalt);

for($i = 0;$i < sizeof($inhalt1);$i++)
$sportarten[$i] = $inhalt1[$i];

natcasesort($sportarten);

foreach($sportarten as $value)
echo $value . '<br>';
?>

Heppi
06.12.2004, 17:39:26
Super, das war's!
Ganz dickes dankeschön!!!!

xabbuh
06.12.2004, 17:48:17
Original geschrieben von Heppi
Super, das war's!
Ganz dickes dankeschön!!!!
Kein Problem, habe selbst ein wenig gebraucht bis ich drauf gekommen bin ;-)