Sortierung mit Usort, deutsche Sonderzeichen
Silja
- php
0 ChrisB1 Felix Riesterer0 Silja0 Silja0 Der Martin0 Silja0 Gunnar Bittersmann0 ChrisB
Hallo,
ich schaffe es bisher nicht, ein array mit usort so zu sortieren, dass die Reihenfolge wie in Wikipedia beschrieben
A, Ä
...
o, ö
ist.
Die Angabe von
setlocale (LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');
bewirkt nichts.
Hat jemand eine Idee?
Danke
Hi,
Die Angabe von
setlocale (LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');
bewirkt nichts.
*Worauf* soll sie wirken?
MfG ChrisB
setlocale (LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');
*Worauf* soll sie wirken?
Nachdem alle Versuche fehlgeschlagen haben, habe ich dies im Internet als (offensichtlich falschen) Tipp gefunden. Nach dem Motto "wenn alles auf deutsch gestellt wird, wird wohl auch die Sortierung entsprechend funktionieren".
Gruß
Silja
Hi,
setlocale (LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');
*Worauf* soll sie wirken?
Nachdem alle Versuche fehlgeschlagen haben, habe ich dies im Internet als (offensichtlich falschen) Tipp gefunden. Nach dem Motto "wenn alles auf deutsch gestellt wird, wird wohl auch die Sortierung entsprechend funktionieren".
Wenn du usort verwendest, musst du ja auch irgendeine Vergleichsfunktion haben …?
MfG ChrisB
Hi
Wenn du usort verwendest, musst du ja auch irgendeine Vergleichsfunktion haben …?
Autsch! Natürlich, ich habe es mit strcmp und strcol versucht.
Gruß
Silja
Moin!
Wenn du usort verwendest, musst du ja auch irgendeine Vergleichsfunktion haben …?
Autsch! Natürlich, ich habe es mit strcmp und strcol versucht.
strcmp benutzt nur einen Byte-Vergleich, keinen Zeichenvergleich, d.h. das Encoding der Strings zerreißt dir jegliche lexikalische Sortierreihenfolge (wobei angeblich laut Userkommentar auf php.net eventuell doch die eingestellte Locale benutzt wird).
Bei strcoll hätte ich trotzdem Angst um das Ergebnis.
Das lexikalische Sortieren ist keine simple Angelegenheit. Mit einer schlichten Vergleichsfunktion ist es nicht getan, denn im deutschen Sprachraum gibt es mindestens drei Sortierreihenfolgemöglichkeiten, von denen man sich irgendwie eine aussuchen können muss:
1. "Normales" Sortieren auf ASCII- bzw. Unicode-Codepoint-Basis:
A B C ... Z [ / ] ... Ä Ö Ü
2. Sortieren nach DIN 5007-1
A=Ä B C ... O=Ö ... U=Ü X Y Z
3. Sortieren nach DIN 5007-2
A Ä=AE B C ... O Ö=OE ... U Ü=UE ... X Y Z
Es gibt außerdem eine große rote Warnung vor dem unbedachten Einsatz von setlocale()
in der Doku:
The locale information is maintained per process, not per thread. If you are running PHP on a multithreaded server API like IIS or Apache on Windows, you may experience sudden changes in locale settings while a script is running, though the script itself never called setlocale(). This happens due to other scripts running in different threads of the same process at the same time, changing the process-wide locale using setlocale().
- Sven Rautenberg
Hi Sven,
in Word wird folgendermaßen sortiert
Baum
Bäum
Mire
More
Möre
Mure
Müre
Mv
Dies hätte ich gerne mit PHP.
Wenn Word das kann, warum nicht auch PHP ohne große Klimmzüge?
Schönen Abend Silja
Moin!
in Word wird folgendermaßen sortiert
Baum
Bäum
Mire
More
Möre
Mure
Müre
MvDies hätte ich gerne mit PHP.
Wenn Word das kann, warum nicht auch PHP ohne große Klimmzüge?
Weil in Word die sortierende Vergleichsfunktion schon eingebaut ist. Und die ist sicherlich umfangreicher als der Bytewertvergleich von strcmp().
- Sven Rautenberg
Hallo,
Wenn Word das kann, warum nicht auch PHP ohne große Klimmzüge?
Weil in Word die sortierende Vergleichsfunktion schon eingebaut ist. Und die ist sicherlich umfangreicher als der Bytewertvergleich von strcmp().
Kennt jemand eine entsprechende Funktion in PHP, vielleicht auch selbst erstellt?
Ich sehe mich leider noch nicht in der Lage hierzu!
Gruß
Silja
Liebe(r) Silj,
Kennt jemand eine entsprechende Funktion in PHP, vielleicht auch selbst erstellt?
Ich sehe mich leider noch nicht in der Lage hierzu!
siehst Du Dich in der Lage, meine längst mit Code-Beispiel gepostete Antwort wenigstens zur Kenntnis zu nehmen?
Liebe Grüße,
Felix Riesterer.
siehst Du Dich in der Lage, meine längst mit Code-Beispiel gepostete Antwort wenigstens zur Kenntnis zu nehmen?
Lieber Felix,
ich bitte vielmals um Entschuldigung - ich hatte Deinen Beitrag leider übersehen.
Das neue Aussehen von Selfhtml ist für mich noch ungewohnt (optische Unterschied zwischen gelesen und ungelesen ist recht klein).
Werde Dein Beispiel gleich testen!
Danke Silja
@@Sven Rautenberg:
nuqneH
- "Normales" Sortieren auf ASCII- bzw. Unicode-Codepoint-Basis:
A B C ... Z [ / ] ... Ä Ö Ü
Was ist an dieser Sortierung »normal«?
Wo könnte sie *sinnvoll* eingesetzt werden?
Qapla'
Liebe(r) Silja,
ich habe das für mich so gelöst:
function normalize_utf8_to_lower_case ($s) {
// replacements for lower-case ASCII-characters
$r = array(
'a' => 'AaÀÁÂÃÅàáâãåĀāĂ㥹ǍǎǺǻẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặΆ',
'ae' => 'ÄäæÆǼǽ',
'b' => 'bB',
'c' => 'CcÇçĆćĈĉĊċČč',
'd' => 'DdÐĎďĐđ',
'e' => 'EeÈÉÊËèéêëĒēĔĕĖėĘęĚěẸẹẺẻẼẽẾếỀềỂểỄễỆệΈ',
'f' => 'Ffƒ',
'g' => 'GgĜĝĞğĠġĢģ',
'h' => 'HhĤĥĦħΉ',
'i' => 'IiÌÍÎÏìíîïĨĩĪīĬĭĮįİıǏǐỈỉỊịΊΐ',
'ij' => 'IJij',
'j' => 'JjĴĵ',
'k' => 'KkĶķĸ',
'l' => 'LlĹĺĻļĽľĿŀŁł',
'm' => 'Mm',
'n' => 'NnÑñŃńŅņŇňʼn',
'ng' => 'Ŋŋ',
'o' => 'OoÒÓÔÕØòóôõøŌōŎŏŐőƠơǑǒǾǿΌỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợ',
'oe' => 'ÖöŒœ',
'p' => 'Pp',
'q' => 'Qq',
'r' => 'RrŔŕŖŗŘř',
's' => 'SsŚśŜŝŞşŠš',
'ss' => 'ßß',
't' => 'TtŢţŤťŦŧ',
'u' => 'UuÙÚÛŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜùúûỤụỦủỨứỪừỬửỮữỰự',
'ue' => 'Üü',
'v' => 'Vv',
'w' => 'WwŴŵẀẁẂẃẄẅ',
'x' => 'Xx',
'y' => 'YyÝýÿŶŷŸΎỲỳỴỵỶỷỸỹ',
'z' => 'ZzŹźŻżŽž'
);
// replace
foreach ($r as $c => $variants) {
$s = preg_replace("~[$variants]~su", $c, $s);
}
return $s;
}
function sort_callback ($a, $b) {
return strnatcasecmp(
normalize_utf8_to_lower_case($a),
normalize_utf8_to_lower_case($b)
);
}
Ist sicherlich nicht perfekt, sollte aber dieses DIN 5007-2 einigermaßen erreichen.
Liebe Grüße,
Felix Riesterer.
Lieber Felix
function normalize_utf8_to_lower_case ($s) {
// replacements for lower-case ASCII-characters
$r = array(
'a' => 'AaÀÁÂÃÅàáâãåĀāĂ㥹ǍǎǺǻẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặΆ',
'ae' => 'ÄäæÆǼǽ',
'b' => 'bB',
'c' => 'CcÇçĆćĈĉĊċČč',
.........
< function sort_callback ($a, $b) {
< return strnatcasecmp(
< normalize_utf8_to_lower_case($a),
< normalize_utf8_to_lower_case($b)
< );
}
>
Ich erhalte einen Fehler ".. unexpected T\_String ...."
an der Stelle
$r = array(
Da ich noch PHP-Anfängerin bin, kann ich die Ursache nicht finden.
Vermutlich ist auch der Aufruf falsch.
Was wird denn an sort\_callback ($a, $b) in den Parametern $a und $b übergeben?
Grüße
Silja
Hi,
function normalize_utf8_to_lower_case ($s) {
// replacements for lower-case ASCII-characters
$r = array(
// …
> >
> Ich erhalte einen Fehler ".. unexpected T\_String ...."
> an der Stelle
> $r = array(
> Da ich noch PHP-Anfängerin bin, kann ich die Ursache nicht finden.
Können wir hier auch nicht. Der von Felix gepostete Code ist syntaktisch korrekt – also musst du bei der Übernahme was falsch gemacht haben; was, das wissen wir nicht.
> Vermutlich ist auch der Aufruf falsch.
> Was wird denn an sort\_callback ($a, $b) in den Parametern $a und $b übergeben?
Das kannst du in der Beschreibung zu usort nachlesen.
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
Hi,
Was wird denn an sort_callback ($a, $b) in den Parametern $a und $b übergeben?
Das kannst du in der Beschreibung zu usort nachlesen.
Wie dies?
bool usort ( array &$array , callable $cmp_function )
sort_callback ( $a, $b)
Also $b eine Funktion?
Hi,
Was wird denn an sort_callback ($a, $b) in den Parametern $a und $b übergeben?
Das kannst du in der Beschreibung zu usort nachlesen.
Wie dies?
Mit die Augen und so ...
bool usort ( array &$array , callable $cmp_function )
sort_callback ( $a, $b)
>
> Also $b eine Funktion?
Nein.
Aus den Beispielen sollte doch wohl deutlich werden, wie es funktioniert.
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
Hi,
Ja, ja, ich kenne die Aussage "Selfhtml" => Hilfe zur Selbsthilfe!
Aus den Beispielen sollte doch wohl deutlich werden, wie es funktioniert.
Aber diese Antwort auf Verständnisprobleme ist wohl nicht sehr hilfreich.
Es gibt nun einmal Menschen, die nicht so hochintelligent und erfahern sind!
Tschau
Silja
Ja, ja, ich kenne die Aussage "Selfhtml" => Hilfe zur Selbsthilfe!
Aus den Beispielen sollte doch wohl deutlich werden, wie es funktioniert.
Das ignoriere ich jetzt mal eiskalt.
Aber diese Antwort auf Verständnisprobleme ist wohl nicht sehr hilfreich.
Keiner von euch möchte wahrscheinlich momentan zu viel verraten, wie mir scheint.
ChrsiB hat angeregt, das Handbuch/die Dokumentation zu befragen.
Aus der Doku kann man folgendes erstes Beispiel entnehmen:
<?php
function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
$a = array(3, 2, 5, 6, 1);
usort($a, "cmp");
foreach ($a as $key => $value) {
echo "$key: $value\n";
}
?>
Das erzeugt die Ausgabe:
0: 1
1: 2
2: 3
3: 5
4: 6
Erklär uns was du nicht verstehst und wir erklären dir was du nicht verstehst.
MfG
bubble
<?php
function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
$a = array(3, 2, 5, 6, 1);
usort($a, "cmp");
foreach ($a as $key => $value) {
echo "$key: $value\n";
}
?>
Erklär uns was du nicht verstehst und wir erklären dir was du nicht verstehst.
Ich verstehe nicht, waum das (mit copy/paste erzeugte) php-Programm bei mir auf Zeile 2 den Fehler meldet "Unexpected T_Variable".
Gruß
Silja
Ich verstehe nicht, waum das (mit copy/paste erzeugte) php-Programm bei mir auf Zeile 2 den Fehler meldet "Unexpected T_Variable".
Das lag wohl an copy/paste.
Jetzt habe ich es in den einfachen Editor eingefügt und dann lief es.
Gibt es eine Möglichkeit auch beim "Paste" in notepadd++ die überflüssigen nicht druckbaren Zeichen zu entfernen?
Gruß
Silja
Gibt es eine Möglichkeit auch beim "Paste" in notepadd++ die überflüssigen nicht druckbaren Zeichen zu entfernen?
Ansicht -> Nichtdruckbare Zeichen -> Alle Zeichen anzeigen
Das entfernt sie zwar nicht, aber du siehst sie ;)
MfG
bubble
Hallo,
Gibt es eine Möglichkeit auch beim "Paste" in notepadd++ die überflüssigen nicht druckbaren Zeichen zu entfernen?
Ansicht -> Nichtdruckbare Zeichen -> Alle Zeichen anzeigen
Das entfernt sie zwar nicht, aber du siehst sie ;)
schon, aber die viel spannendere Frage ist doch: Wo kommen diese zusätzlichen, nicht druckbaren Zeichen überhaupt her? Wenn ich den besagten Codeauszug aus dem Posting von Felix kopiere, habe ich nichts als druckbare Zeichen, Whitespace und Zeilenumbrüche.
Ciao,
Martin
schon, aber die viel spannendere Frage ist doch: Wo kommen diese zusätzlichen, nicht druckbaren Zeichen überhaupt her? Wenn ich den besagten Codeauszug aus dem Posting von Felix kopiere, habe ich nichts als druckbare Zeichen, Whitespace und Zeilenumbrüche.
Geht mir genauso.
Allerdings fehlt mir jeglicher Ansatz der auf den Ursprung deutet.
MfG
bubble
Hi,
<?php
function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}$a = array(3, 2, 5, 6, 1);
usort($a, "cmp");
foreach ($a as $key => $value) {
echo "$key: $value\n";
}
?>
> > Erklär uns was du nicht verstehst und wir erklären dir was du nicht verstehst.
> >
> Ich verstehe nicht, waum das (mit copy/paste erzeugte) php-Programm bei mir auf Zeile 2 den Fehler meldet "Unexpected T\_Variable".
Der Code, so wie er oben steht?
[Tut er *nicht*.](http://3v4l.org/YeHuY)
Wenn du Hilfe bekommen willst, dann solltest du schon genau beschreiben was für Code bei dir den Fehler verursacht.
(Und außerdem solltest du dich eigentlich erst mal so weit mit den Grundlagen beschäftigen, dass du die Ursache simpler Syntaxfehler selber finden kannst.)
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
Tat er doch, siehe meinen Beitrag von 18:12
Moin!
Was wird denn an sort_callback ($a, $b) in den Parametern $a und $b übergeben?
Das kannst du in der Beschreibung zu usort nachlesen.
Wie dies?
Mit die Augen und so ...
Da klar ist, dass ihr beide dasselbe gesehen habt (mit den Augen und so), wäre an dieser Stelle offensichtlich eine Erklärung des Gesehenen angebracht (mit Nachdenken und so).
- Sven Rautenberg
Liebe(r) Silja,
mein Code setzt voraus, dass Deine PHP-Scripte in UTF-8 gespeichert sind, sonst sind viele der Zeichen mit Deinem gewählten Encoding (ISO-8859-1?) nicht darstellbar. Wer heutzutage noch immer kein UTF-8 benutzt, macht sich das Leben unnötig schwer.
Was wird denn an sort_callback ($a, $b) in den Parametern $a und $b übergeben?
Jeweils ein Array-Element (was steht in Deinem Array?). Eine Callback-Funktion soll laut Dokumentation (hattest Du diese nicht gefunden oder nicht verstanden?) zwei Parameter zum Vergleich entgegen nehmen. Als Rückgabewerte sind -1 (für "kleiner"), 0 (für "gleich") und 1 (für "größer") zurück zu geben. In dem Verlinkten Beispiel wird das auch so gemacht.
In PHP gibt es bereits Vergleichsfunktionen wie z.B. strcmp, welche genau das tun (Strings vergleichen), allerdings vielleicht nicht in der von Dir gewünschten Form (willst Du GrOß-/kLeIn-Schreibung berücksichtigen oder hast Du keine Strings in Deinem Array?). Daher kann man, wenn die vorhandenen Funktionen nicht Deinen Wünschen entsprechen, eine eigene Vergleichsfunktion schreiben, die man dann von usort und seinen Brüdern (uasort, uksort) als Vergleichsfunktion nutzen lassen kann. Damit diese u_sort-Funktionen Deine spezialisierte Vergleichsfunktion auch nutzen können, musst Du ihren Namen im zweiten Parameter als String übergeben.
Das wäre der Sinn des PHP-Beispiels in der Doku gewesen.
Liebe Grüße,
Felix Riesterer.
Vielen Dank liebe(r) Felix,
dieser Beitrag hat mir sehr geholfen!
Viele Grüße
Silja (f)
Liebe Silja,
Vielen Dank liebe(r) Felix,
dieser Beitrag hat mir sehr geholfen!
ausgezeichnet. Danke für die Rückmeldung.
Silja (f)
Aha! Jetzt weiß ich mehr. ;-)
Liebe Grüße,
Felix Riesterer.
Hallo Felix,
jetzt habe ich doch noch ein Problem.
Obwohl der Dateiinhalt UTF-codiert ist passiert folgendes
<?php
$a = 'Ä Ö Ü ä ö ü';
echo "$a"; // Ergebnis: Ä Ö Ü ä ö ü
Woran könnte dies liegen?
Gruß
Silja
Hallo,
Obwohl der Dateiinhalt UTF-codiert ist passiert folgendes
<?php
$a = 'Ä Ö Ü ä ö ü';
echo "$a"; // Ergebnis: Ä Ö Ü ä ö ü
> Woran könnte dies liegen?
das sieht so aus, als wäre der Dateiinhalt tatsächlich in UTF-8, aber dein Server verkauft es dem Browser als ISO-8859-1. Also eine falsche Codierungsangabe im Header. Sozusagen der richtige Inhalt in der Dose, aber das falsche Etikett drauf.
Normalerweise müsste man das in der Serverkonfiguration korrigieren; da du aber sowieso schon PHP verwendest, kannst du die korrekten Header auch mit PHP setzen:
`header('Content-Type: text/html; charset: UTF-8');`{:.language-php}
Wichtig ist, dass diese Anweisung ganz am Anfang des Scripts steht - davor darf keine andere Ausgabe erfolgen, nicht einmal eine Leerzeile.
Ciao,
Martin
--
Verliebt: Er spricht, sie lauscht.
Verlobt: Sie spricht, er lauscht.
Verheiratet: Beide sprechen, und die Nachbarn lauschen.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
Hallo Martin,
header('Content-Type: text/html; charset: UTF-8');
danke, das war's
Gruß
Silja
@@Der Martin:
nuqneH
das sieht so aus, als wäre der Dateiinhalt tatsächlich in UTF-8, aber dein Server verkauft es dem Browser als ISO-8859-1. Also eine falsche Codierungsangabe im Header. Sozusagen der richtige Inhalt in der Dose, aber das falsche Etikett drauf.
Normalerweise müsste man das in der Serverkonfiguration korrigieren; da du aber sowieso schon PHP verwendest, kannst du die korrekten Header auch mit PHP setzen:
header('Content-Type: text/html; charset: UTF-8');
Man könnte das auch durch Hinzufügen eines BOMs korrigieren. (Allerdings noch nicht cross-browser.) Vorrang vor HTTP
BTW, Anmerkungen zur Übersetzung willkommen.
Qapla'
Hi,
Normalerweise müsste man das in der Serverkonfiguration korrigieren; da du aber sowieso schon PHP verwendest, kannst du die korrekten Header auch mit PHP setzen:
header('Content-Type: text/html; charset: UTF-8');
Man könnte das auch durch Hinzufügen eines BOMs korrigieren. (Allerdings noch nicht cross-browser.) Vorrang vor HTTP
Und unter PHP handelt man sich damit mit großer Wahrscheinlichkeit weitere Probleme ein, weil das immer noch nur Byte-Datenströme betrachtet und von der Extistenz von Zeichenkodierungen bisher nur ansatzweise Kenntnis genommen hat.
Die Nutzung der BOM zur Angabe der Zeichenkodierung sollte man also in dem Umfeld momentan und bis auf weiteres vermeiden; die Faustregel lautet weiterhin, PHP-Scripte als „UTF-8 ohne BOM” abspeichern. (Wenn man die BOM nicht auf Script-, sondern erst auf Inhaltsebene einfügt, ist das zwar weniger problematisch – aber wenn bspw. mehrere Template-Dateien ineinander einbindet, gibt’s auch wieder Salat, mit BOMs nicht nur am Anfang, sondern auch mitten drin im Inhalt. Also besser ganz ohne BOMmeln.)
MfG ChrisB