Moses: array sortieren Groß/Kleinschreibung Sonderzeichen

Hallo,
habe mal wieder ein Problem mit den Arrays....
Mache eine Datenbankabfrage (MySql) nach einem Feld, dass leider mehrere Einträge haben kann (daran kann ich nicts ändern, habe es schon mehrfach angesprochen aber das soll so bleiben). Das Ergebnis packe ic in ein Array und dieses möchte alphabetisch sortieren. Problem ist allerdings, dass bei Sortieren nach Groß und Kleinbuchstaben unterschieden wird (also wenn ein Name mit kleinem a anfängt wird der ans Ende der Liste geschrieben) und auch die Sonderzeichen Ä Ü Ö È etc. nicht bei den jeweiligen Buchstaben stehen, sondern als eigene Buchstaben am Ende der Liste aufgeführt werden.
Welche Parameter muß ich angeben, damit das richtig sortiert wird?
Hier etwas verkürzt das Beispiel zum besseren Verständnis

$query="select name from tabelle order by name";
$erg=mysql_query($query);
if(!erg)
die("Abfrage klappt nicht");
else
{
while($aus=mysql_fetch_array($erg))
{
$titel=explode("/",$aus["name"]);
foreach($titel as $inhalt=>$wert)
                             {
                             $wert=trim($wert);
if(isset($ausgabe[$wert]))
{
$ausgabe[$wert][]=$zwischen;
}
else
{
$ausgabe[$wert][]=$zwischen;
}
    }

	}  

ksort($ausgabe);

}
$xyz=1;
foreach($ausgabe as $inhalt=>$wert)
{

$abc=substr("$inhalt",0,1);  
if($abc!=$xyz)  
{  
echo "<br><br><b>$abc</b><br>";  
$xyz=$abc;  
}  

echo "<b>$inhalt</b> - ";
 
 }

Mmmh nicht sehr elegant ich weiß...
Ich möchte eine Liste haben wie
A
Älster
Albert
armin
àzcok

B
Berta
Brunhilde
bussar

...

aber nach dem obigen Testen schaut die LIste so aus:

A
Albert
B
Berta
Brunhilde
a
armin
b
bussar
à
àzcok

Danke und Grüße,
Moses

  1. @@Moses:

    nuqneH

    Welche Parameter muß ich angeben, damit das richtig sortiert wird?

    Warum schust du nicht in der Doku nach?

    Qapla'

    --
    Bildung lässt sich nicht downloaden. (Günther Jauch)
  2. Moin!

    Mache eine Datenbankabfrage (MySql) nach einem Feld, dass leider mehrere Einträge haben kann (daran kann ich nicts ändern, habe es schon mehrfach angesprochen aber das soll so bleiben). Das Ergebnis packe ic in ein Array und dieses möchte alphabetisch sortieren. Problem ist allerdings, dass bei Sortieren nach Groß und Kleinbuchstaben unterschieden wird (also wenn ein Name mit kleinem a anfängt wird der ans Ende der Liste geschrieben) und auch die Sonderzeichen Ä Ü Ö È etc. nicht bei den jeweiligen Buchstaben stehen, sondern als eigene Buchstaben am Ende der Liste aufgeführt werden.

    Verstehe nicht, warum du die Sortierung der Datenbank nicht übernimmst. Wenn du für das Feld "name" die "richtige" (sprich: gewünschte) Kollation angibst, sortiert dir MySQL diese Spalte recht genau so, wie du es dir vorstellst - ohne dass du in PHP auch nur einen Finger krumm machen musst.

    Funktioniert ab MySQL 4.1.

    - Sven Rautenberg

    1. Moin!

      Verstehe nicht, warum du die Sortierung der Datenbank nicht übernimmst. Wenn du für das Feld "name" die "richtige" (sprich: gewünschte) Kollation angibst, sortiert dir MySQL diese Spalte recht genau so, wie du es dir vorstellst - ohne dass du in PHP auch nur einen Finger krumm machen musst.

      Funktioniert ab MySQL 4.1.

      • Sven Rautenberg

      Moin, moin,
      das Problem ist doch, dass in dem Feld Name z.B. "Hans / Albert" im nächsten Feld "ènrique / berta / Zumwinkel" steht wenn mir die Datenbank das sortiert dann doch immer nach dem ersten Namen oder gibt es da eine Möglichkeit die ich nicht kenne schon bei der Abfrage die Felder zu splitten?

      Grüße,
      Moses

      1. Moin!

        Moin, moin,
        das Problem ist doch, dass in dem Feld Name z.B. "Hans / Albert" im nächsten Feld "ènrique / berta / Zumwinkel" steht wenn mir die Datenbank das sortiert dann doch immer nach dem ersten Namen oder gibt es da eine Möglichkeit die ich nicht kenne schon bei der Abfrage die Felder zu splitten?

        Nö, stimmt. Da du keine Beispieldaten in der DB angegeben hattest, habe ich deine Problembeschreibung reduziert auf "Wie sortiert man?"

        Und korrekt ist: Man sortiert dann am besten, wenn man die DB mit einer vernünftigen Normalisierung das Sortieren machen läßt. Alles andere ist Krampf und viel manuelle Arbeit.

        Schätze, du kommst um eine eigene Sortierfunktion nicht herum, die die gewünschten Zeichenvergleiche vornimmt und auch gleich mal case-insensitiv ist.

        - Sven Rautenberg

  3. echo $begrüßung;

    Das Ergebnis packe ic in ein Array und dieses möchte alphabetisch sortieren. Problem ist allerdings, dass bei Sortieren nach Groß und Kleinbuchstaben unterschieden wird (also wenn ein Name mit kleinem a anfängt wird der ans Ende der Liste geschrieben) und auch die Sonderzeichen Ä Ü Ö È etc. nicht bei den jeweiligen Buchstaben stehen, sondern als eigene Buchstaben am Ende der Liste aufgeführt werden.

    Die Sortierung erfolgt "ASCII-betisch". Wenn du eine Sortierung gemäß den Regeln einer spezifischen Sprache haben möchtest, müssen die Zeichen entsprechend ihrer Bedeutung und nicht nach ihrem Bytewert verglichen werden.

    Welche Parameter muß ich angeben, damit das richtig sortiert wird?
    ksort($ausgabe);

    ksort() sortiert nur "ASCII-betisch". Du kannst eine Sortierfunktion mit benutzerdefinierter Vergleichsfunktion (u*sort) zum Sortieren und strcoll() zum Vergleichen verwenden. Auch brauchst du ein passend eingestellte "locale information" (setlocale()).

    echo "$verabschiedung $name";

    1. BAHNHOF :-(

      Ok, also das heißt ich komme nicht darum herum eine "Sortier-Funktion" zu schreiben die sagt schaue erstes Zeichen an falls Ä sortiere unter Ae falls a sortiere unter A usw., usw????
      Sch* und ich habe denen mehrfach gesagt keine Doppelteneinträge in der DB...

      Gibt es da nicht schon irgendwo ein Script das ich übernehmen könnte (bin mir sicher, dass ich nicht der erste bin der dieses Problem hat)?
      Bzw. damit ich mir das Rumexperimentieren etwas erleichtere welche sort Funktion nimmt man denn am besten als Ausgangsbasis? usort, uasort, uksort, sort, ???? HILFE stehe auf dem Schlauch....

      Grüße,
      Moses

      1. Hi,

        Ok, also das heißt ich komme nicht darum herum eine "Sortier-Funktion" zu schreiben die sagt schaue erstes Zeichen an falls Ä sortiere unter Ae falls a sortiere unter A usw., usw????

        Kommt drauf an.
        dedlfix hatte dir gerade schon einen Funktion verlinkt, die auch Locale-Einstellungen berücksichtigt - und damit die Anforderung an die Vergleichsfunktion ggf. schon erfüllen könnte.

        Bzw. damit ich mir das Rumexperimentieren etwas erleichtere welche sort Funktion nimmt man denn am besten als Ausgangsbasis? usort, uasort, uksort, sort, ????

        Die, die das macht, was du willst.
        Und um das herauszufinden, liest du jetzt bitte mal in der Dokumentation nach, welche von denen was macht.

        HILFE stehe auf dem Schlauch....

        Dann steig selber runter.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. Hallo,
          also erstmal Danke.
          Ein bisschen weiter bin ich schon gekommen:

          uksort($ausgabe, 'strnatcasecmp');

          Jetzt sortiert er mir die Groß- und Kleinbuchstaben so wie ich das will - Wunderbar! Aber mit den Sonderzeichen habe ich noch so meine Probleme und auch das Nachlesen bei Locale-Einstellungen bringt mich nicht weiter - raff es irgendwie nicht so ganz...
          Was mache ich wenn ein Eintrag z.B. mit " beginnt also z.B. '"Der Brecher" Müller, Stefan' -> dieser Eintrag sollte unter D mit reinsortiert werden (ok, gehe mal davon aus, daß es eine Funktion gibt die sagt nehme den ersten Buchstaben des Eintrags - das sollte ich noch selber finden...)

          aber was ist mit Ø -> der sollte bei O mit reinkommen.... klar ist das eine lokale Einstellung, aber da gibt es doch soviele verschiedene Möglichkeiten und man kann doch nicht für jede lokale Besonderheit im Vorfeld eine Möglichkeit einberechnen....

          Grüße,
          Moses

          1. Hi,

            uksort($ausgabe, 'strnatcasecmp');

            strnatcasecmp ist immer noch nciht die Funktion, die dir empfohlen wurde.

            Was mache ich wenn ein Eintrag z.B. mit " beginnt also z.B. '"Der Brecher" Müller, Stefan' -> dieser Eintrag sollte unter D mit reinsortiert werden

            Nun, das hat mit der Locale natürlich eher weniger zu tun.

            Die Locale beeinhaltet einer Sprache innewohnende Sortier-/Vergleichsregelungen - also bspw., dass im Deutschen ä wie ae behandelt wird, oder im Schwedischen ü wie y.

            Aber sowas wie "berücksichtigte ein führendes Anführungszeichen nicht" - das ist eine sehr spezielle Anforderung.

            aber was ist mit Ø -> der sollte bei O mit reinkommen....

            Entweder findest du eine Locale, die das alles abdeckt - oder du wirst dir doch eine eigene Vergleichsfunktion schreiben müssen.

            Was man auch noch machen könnte, erst mal "übersetzen", als bspw. das Ø durch O ersetzen, (führende) Anführungszeichen entfernen, etc. [1] - und dann diese bearbeiteten Werte zum Sortieren nutzen. (Natürlich muss man diese dann parallel zu den Originalwerten ablegen, denn letztere sollen ja letztendlich nach wie vor ausgegeben werden.)

            [1] Dafür könnten schon str_replace (mit Suchen- und Ersetzen-Arrays gefüttert) und trim ausreichen.

            MfG ChrisB

            --
            Light travels faster than sound - that's why most people appear bright until you hear them speak.
        2. @@ChrisB:

          nuqneH

          »» HILFE stehe auf dem Schlauch....

          Dann steig selber runter.

          ?? Ist es nicht Moses’ Aufgabe, übers Wasser zu laufen?

          Wenn das Wasser im Schlauch ist, ist die Aufgabe leichter ...

          Qapla'

          --
          Bildung lässt sich nicht downloaden. (Günther Jauch)
          1. Nein, nein,
            Moses teilte das Wasser, aber wenn ich den Schlauch teile gibt es immer eine riesen Sauerei und ich komme trotzdem nicht weiter... ;-)

            Grüße,
            Moses

    2. @@dedlfix:

      nuqneH

      ksort() sortiert nur "ASCII-betisch".

      Sicher?

      Qapla'

      --
      Bildung lässt sich nicht downloaden. (Günther Jauch)
      1. echo $begrüßung;

        » ksort() sortiert nur "ASCII-betisch".
        Sicher?

        Dabei hab ich doch extra bei sort() nachgesehen, was es für Flags gibt. Warum hab ich da das SORT_LOCALE_STRING überlesen? Damit berücksichtigt auch ksort() die locale-Einstellung.

        echo "$verabschiedung $name";