Array unabhängig von Groß-/Kleinschr. sortieren
Mastershrimp
- php
Heyho!
Es gibt ja 3 verschiedene Arten mit sort() einen Array zu sortieren:
SORT_REGULAR - Vergleiche Einträge normal
SORT_NUMERIC - Vergleiche Einträge numerisch
SORT_STRING - Vergleiche Einträge als Strings
Ich möchte nun, dass in einem Array die Werte alphabetisch geordnet werden - und zwar so, dass "a" wie "A" behandelt wird. SORT_STRING fällt da schonmal weg. SORT_NUMERIC ja sowieso, oder?
Und SORT_REGULAR bringt bei mir irgendwie dasselbe Ergebnis wie SORT_STRING...
Weiß einer von euch, wie ich den Array so sortieren kann, dass er Groß/-Kleinschreibung _nicht_ beachtet?
Habe schon hier, im PHP Manual und in Google gesucht, aber irgendwie nix brauchbares herausbekommen.
Danke schonmal!
Chapeau! ;)
Mastershrimp
Hi Mastershrimp,
Habe schon hier, im PHP Manual und in Google gesucht, aber irgendwie nix brauchbares herausbekommen.
Vielleicht hilft dir das, hab ich in SelfPHP gefunden: http://www.selfphp.de/funktionsreferenz/array_funktionen/natcasesort.php
MfG, Dennis.
Heyho!
Vielleicht hilft dir das, hab ich in SelfPHP gefunden: http://www.selfphp.de/funktionsreferenz/array_funktionen/natcasesort.php
Ja! Perfekt. Werde es direkt mal ausprobieren. Würde mich nochmal melden, wenn's nicht klappt.
Danke!
Chapeau! ;)
Mastershrimp
Hallo!
Muss mich leider nochmal melden. Momentan sortiert der absolut wahllos.
Nach einer Sortierung sieht mein Array so aus:
maxwell.jpg
Facharbeit_Robert_DeutschLK.zip
igel1a.jpg
f-arb_Duke_Roboter.zip
Bio-Ethik.zip
f-arb_max_mediapark.zip
Maxwell!!!.jpg
Facharbeit Corinna.zip
affe4.JPG
armer robert.JPG
chill_clan.jpg
Laura, Franzi und ich!!!.jpg
avatar_jhoo.jpg
f-arb_Mo_Fauststoff.zip
freund54.jpg
mathe_funkionen.zip
P1000228.jpg
sponge.JPG
Ich erkenne da absolut kein System. Fehler werden auch keine ausgegeben. Sortiert hat der also.
Hintergrund: Ich lese aus einem Verzeichnis alle Dateien aus und möchte diese in alph. Reihenfolge ausgeben. Leider kommt da obiges Ergebnis raus.
Die entsprechende Code-Stelle wäre:
//Dateinamen aus Verzeichnis in Array schreiben
while($inhalt = readdir($verz))
{
if($inhalt != "." && $inhalt != ".." && strpos($inhalt,".") != false && $inhalt != "404.jpg" && $inhalt != ".htaccess")
{
$array_dateien[] = $inhalt;
}
}
natcasesort($array_dateien); //Array alph. sortieren
for($u=0; $u<count($array_dateien); $u++)
{ echo "<br>" . $array_dateien[$u]; }
Wo ist der Fehler? Oder ist das ein Bug?
Danke schonmal!
gruß
Mastershrimp
Hi Mastershrimp,
Ich habe das jetzt gerade auch einmal getestet.
============== Script ================
//Angenommen wir habe ein Array:
$data = array("thomas","Thorsten","Dennis","susanne","Sabine","Susanne","Alef","alex","keine
//Wenn wir darauf jetzt die Sortierung anwenden:
natcasesort($data);
//Und jetzt das Array mit einer Forschleife ausgeben
for($x=0;$x<count($data);$x++) echo $data[$x];
//erhalten wir diese willkürliche Ausgabe,
//welche aber in Wirklichkeit der Eingabe entspricht!
//Wenn wir doch jetzt print_r() anwenden:
echo "<pre>";
print_r($data);
echo "</pre>";
//kriegen wir das Array genauso ausgeben, wie gewünscht
============ /script =================
Du siehst also, dass die funktion nicht ohne Wirkung geblieben ist.
Weiter weiß ich jetzt aber leider auch nicht mehr :-(
Aber es sind sicherlich noch genung Leute da, die dir weiterhelfen können.
MfG, Dennis.
Hmm. Danke schonmal. print_r bringt mir glaub ich in dem Fall nichts, weil ich später noch mit den Array-Elementen diverse Sachen machen muss.
SelfPHP behauptet ja, dass die geordnete Ausgabe wie folgt aussähe:
Array ( [0] => PHP2 [1] => PHP3 [2] => PHP4 [3] => PHP10 )
Und wenn ich die per for()-Schleife ausgeben würde, käme ich ja auch zum gewünschten Ergebnis.
Irgendwie ist SelfPHP generell etwas "arm" im Vergleich zu SelfHTML. Man kann es allenfalls als Funktionsreferenz benutzen...
Ich such mal im offiziellen PHP Manual nach der Funktion. Vielleicht sagen die noch was anderes.
Würde mich dennoch über weitere Tipps freuen!
Danke dir schonmal bis hierhin!
Chapeau! ;)
Mastershrimp
Habs herausgefunden! SelfPHP hat Mist erzählt. Die Funktion sortiert zwar einen Array, lässt aber die Nummerierung bestehen, sodass man bei for() immer noch die alte Reihenfolge ausgibt.
In den Comments stand dann folgender Hinweis, der das Problem löste:
Something that should probably be documented is the fact that both natsort and natcasesort maintain the key-value associations of the array. If you natsort a numerically indexed array, a for loop will not produce the sorted order; a foreach loop, however, will produce the sorted order, but the indices won't be in numeric order. If you want natsort and natcasesort to break the key-value associations, just use array_values on the sorted array, like so:
natcasesort($arr);
$arr = array_values($arr);
Danke an alle, die sich die Mühe gemacht haben, mir zu helfen!
Hi Mastershrimp,
Habs herausgefunden! SelfPHP hat Mist erzählt. Die Funktion sortiert zwar einen Array, lässt aber die Nummerierung bestehen, sodass man bei for() immer noch die alte Reihenfolge ausgibt.
Genau das war es ja, was ich meinte und was ich dir mit print_r() zeigen wollte.
Nur wusste ich nicht, wie man die Nummern ändern kann.
In den Comments stand dann folgender Hinweis, der das Problem löste:
Something that should probably be documented is the fact that both natsort and natcasesort maintain the key-value associations of the array. If you natsort a numerically indexed array, a for loop will not produce the sorted order; a foreach loop, however, will produce the sorted order, but the indices won't be in numeric order. If you want natsort and natcasesort to break the key-value associations, just use array_values on the sorted array, like so:
natcasesort($arr);
$arr = array_values($arr);
Also der Befehlt array_values() vergibt die Nummern in Array neu in der aktuellen Reihenfolge?
Danke an alle, die sich die Mühe gemacht haben, mir zu helfen!
Waren ja verdammt viele ;-)
MfG, Dennis.
Hi Dennis,
Also der Befehlt array_values() vergibt die Nummern in Array neu in der aktuellen Reihenfolge?
Genauso ist es, wichtig ist jedoch, dass array_value() nicht im OriginalArray arbeitet, sondern ein neues Array zurückliefert und man somit schreiben muss:
$neues_array = array_values($altes_array);
Im Gegensatz zu sort().
MfG, Dennis.