Rüdiger L: alphabetisches sortieren von mehrdimensionalen arrays

hallo zusammen

mal wieder das "alphabetische sortieren von mehrdimensionalen arrays" :-(
hab gegoogelt, nichts gefunden
dann selbst rumprobiert und das kam raus:

function sort_abc($a, $b){
   if(strtoupper($a[3]{0}) == "Ä"){$a[3]{0} = "A";}
   if(strtoupper($a[3]{0}) == "Ö"){$a[3]{0} = "O";}
   if(strtoupper($a[3]{0}) == "Ü"){$a[3]{0} = "U";}
   if(strtoupper($b[3]{0}) == "Ä"){$b[3]{0} = "A";}
   if(strtoupper($b[3]{0}) == "Ö"){$b[3]{0} = "O";}
   if(strtoupper($b[3]{0}) == "Ü"){$b[3]{0} = "U";}
   if(strtoupper($a[3]{0}) == strtoupper($b[3]{0})) return 0;
   return (strtoupper($a[3]{0}) > strtoupper($b[3]{0}))?1:-1;
}

leider ist es noch nicht das optimale
hab zwar jetzt nicht mehr die Ä,ä,Ü,ü,Ö,ös am schluss sondern bei den jeweiligen buchstaben aber auch nicht am anfang wo sie hingehören
die ausgabe sieht jetzt so aus:

äußere
Auspacken
äußere
Auslauf
Auspacken
äußere
Alter

so sehen mein array aus:

Array(
[196] => Array(
      [0] => 196
      [1] => 126
      [2] => 71
      [3] => Auspacken

[46] => Array(
      [0] => 46
      [1] => 87
      [2] => 34
      [3] => äußere
usw...}

leider bin ich mit meinem latein am ende :-(
hoffe ein wissender kann mir da weiterhelfen.
ich glaube auch, das es nicht besonders elegant ist (naja, funktioniert ja auch nicht richtig).

ich sag mal vielen dank im voraus für eure hilfe

Gruß Rüdiger

--
einen schönen Tag
Gruß Bertl
  1. Hallo Rüdiger,

    dann selbst rumprobiert und das kam raus:

    function sort_abc($a, $b){
       if(strtoupper($a[3]{0}) == "Ä"){$a[3]{0} = "A";}
       if(strtoupper($a[3]{0}) == "Ö"){$a[3]{0} = "O";}
       if(strtoupper($a[3]{0}) == "Ü"){$a[3]{0} = "U";}
       if(strtoupper($b[3]{0}) == "Ä"){$b[3]{0} = "A";}
       if(strtoupper($b[3]{0}) == "Ö"){$b[3]{0} = "O";}
       if(strtoupper($b[3]{0}) == "Ü"){$b[3]{0} = "U";}

    okay, du behandelst bei der Sortierung also ä,ö,ü wie a,o,u und kümmerst dich außerdem nicht um Groß/Kleinschreibung. Gut. Aber dass hier zweimal hintereinander genau dasselbe steht, ist dir nicht aufgefallen? Einmal hätte genügt ...

    if(strtoupper($a[3]{0}) == strtoupper($b[3]{0})) return 0;
       return (strtoupper($a[3]{0}) > strtoupper($b[3]{0}))?1:-1;

    Außerdem vergleichst du immer nur das erste Zeichen deiner Strings. Das heißt, die Wörter "Auspuff", "Anpfiff", "ähnlich", "ätsch" und "aaa" sortieren alle gleichrangig.

    hab zwar jetzt nicht mehr die Ä,ä,Ü,ü,Ö,ös am schluss sondern bei den jeweiligen buchstaben aber auch nicht am anfang wo sie hingehören

    Was meinst du mit "auch nicht am Anfang"?
    Was in deiner Vergleichsfunktion fehlt, ist eine Schleife, die Zeichen für Zeichen durch den String marschiert, bis sie sich an einer Stelle unterscheiden oder einer der beiden Strings zu Ende ist.

    äußere
    Auspacken
    äußere
    Auslauf
    Auspacken
    äußere
    Alter

    Naja, du sortierst ja auch nicht *innerhalb* der Begriffe, die mit [AaÄä] anfangen. Sonst müsste sich folgende Reihenfolge ergeben, wenn du das Prinzip konsequent weiterführst:

    Alter
    ändern
    Auslauf
    Auspacken
    Auspacken
    äußere
    äußere
    äußere
    Axt

    Die Begriffe "Ändern" und "Axt" habe ich noch hinzugefügt, um das Prinzip deutlicher zu machen.

    So long,
     Martin

    --
    Lieber eine Fliege im Porzellanladen
    als ein Elefant in der Suppe.
    1. hallo Martin,

      erst mal danke für deine antwort

      »okay, du behandelst bei der Sortierung also ä,ö,ü wie a,o,u und »kümmerst dich außerdem nicht um Groß/Kleinschreibung. Gut. Aber dass »hier zweimal hintereinander genau dasselbe steht, ist dir nicht »aufgefallen? Einmal hätte genügt ...
      »
      »    if(strtoupper($a[3]{0}) == strtoupper($b[3]{0})) return 0;
      »    return (strtoupper($a[3]{0}) > strtoupper($b[3]{0}))?1:-1;
      so hab ich auch versucht dann stehen aber die umlaute am schluss nach  z
      »
      » Außerdem vergleichst du immer nur das erste Zeichen deiner Strings. »Das heißt, die Wörter "Auspuff", "Anpfiff", "ähnlich", "ätsch" und "aaa" sortieren alle gleichrangig.
      stimmt, hab ich nicht bedacht :-(
      »
      » Was meinst du mit "auch nicht am Anfang"?
      das erst Ä dann A kommt, dacht das ist üblich wenn man alphabetisch sortiert oder liege ich da falsch?
      » Was in deiner Vergleichsfunktion fehlt, ist eine Schleife, die Zeichen für Zeichen durch den String marschiert, bis sie sich an einer Stelle unterscheiden oder einer der beiden Strings zu Ende ist.

      ja das dachte ich mir auch schon, aber ich hab da nicht mal einen kleinen schimmer wie ich das realisieren kann :-(, leider.

      ich weiss das es hier nicht gern gelesen wird, aber hast du oder ein anderer mir eine code-schnippsel mit dem ihr mir auf die sprünge helfen könnt, wär darüber sehr dankbar.

      vielen dank im voraus für eure hilfe

      Gruß Rüdiger

      1. hallo zusammen

        nachdem ich mein antwort-post gesehen habe, musste ich feststellen das meine kommentare sich nicht absetzen wie bei den anderen (schwarz - blau)

        was mache ich falsch??

        Gruß Rüdiger

      2. Hallo,

        Außerdem vergleichst du immer nur das erste Zeichen deiner Strings. Das heißt, die Wörter "Auspuff", "Anpfiff", "ähnlich", "ätsch" und "aaa" sortieren alle gleichrangig.
        stimmt, hab ich nicht bedacht :-(

        okay, Schwäche erkannt. Ist ein guter Anfang. ;-)

        Was meinst du mit "auch nicht am Anfang"?
        das erst Ä dann A kommt, dacht das ist üblich wenn man alphabetisch sortiert oder liege ich da falsch?

        Ich habe nicht den Eindruck, dass das üblich ist. In Telefonbüchern werden Wörter/Namen mit Umlauten immer ziemlich willkürlich einsortiert, das scheint keiner Regel zu folgen. Ich selbst würde, soweit es die Sortierung betrifft, 'a' und 'ä' identisch behandeln, was wiederum zur Folge hat, dass Wörter, die mit 'a' oder 'ä' beginnen, durchmischt werden, je nachdem, welcher Buchstabe danach folgt.

        Was in deiner Vergleichsfunktion fehlt, ist eine Schleife, die Zeichen für Zeichen durch den String marschiert, bis sie sich an einer Stelle unterscheiden oder einer der beiden Strings zu Ende ist.
        ja das dachte ich mir auch schon, aber ich hab da nicht mal einen kleinen schimmer wie ich das realisieren kann :-(, leider.

        Hmm. Also das gewisse Etwas, das "Feeling" des Programmierers, scheint dir zu fehlen? Ist nicht abwertend gemeint. Jeder hat seine Stärken und Schwächen woanders.

        ich weiss das es hier nicht gern gelesen wird, aber hast du oder ein anderer mir eine code-schnippsel mit dem ihr mir auf die sprünge helfen könnt, wär darüber sehr dankbar.

        Also: Du hast zwei Strings $a und $b.
         * Lasse eine Schleife von 0 bis strlen($a)-1 laufen und ersetze alle
           Zeichen in $a, falls zutreffend (Umlaut-Konvertierung).
         * Lasse eine Schleife von 0 bis strlen($b)-1 laufen und ersetze alle
           Zeichen in $b, falls zutreffend (Umlaut-Konvertierung).
         * Und jetzt kannst du die normalen String-Vergleichsfunktionen nutzen:
           Gib 0 zurück, wenn $a==$b
           Gib +1 zurück, wenn $a>$b
           Gib -1 zurück, wenn $a<$b

        Umsetzen kannst du das nun bestimmt selbst. :-)
        So long,
         Martin

        --
        Wenn du beim Kochen etwas heißes Wasser übrig hast, friere es ein.
        Heißes Wasser kann man immer gebrauchen.
        1. hi,

          das erst Ä dann A kommt, dacht das ist üblich wenn man alphabetisch sortiert oder liege ich da falsch?

          Ich habe nicht den Eindruck, dass das üblich ist. In Telefonbüchern werden Wörter/Namen mit Umlauten immer ziemlich willkürlich einsortiert, das scheint keiner Regel zu folgen.

          Nein?

          Ich selbst würde, soweit es die Sortierung betrifft, 'a' und 'ä' identisch behandeln,

          Entweder so - oder ä eben als ae behandeln.

          Aber eine "willkürliche" Sortierung dürfte einem doch recht selten unterkommen.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. n'abend,

    mal wieder das "alphabetische sortieren von mehrdimensionalen arrays" :-(
    hab gegoogelt, nichts gefunden

    was du im Konkreten falsch gemacht hast, oder einfach nicht bedacht hast, hat dir Martin bereits gezeigt. In meinem tollen vollgemüllten /tests/ Verzeichnis bin ich eben über folgendes gestolpert:

    <?php  
      
    $array = array(  
      array( "hallo welt", 1 ),  
      array( "hallo wald", 2 ),  
      array( "Heinrich wald", 2 ),  
      array( "albert wald", 2 ),  
      array( "adolf wald", 2 ),  
      array( "adalbert wald", 2 ),  
      array( "Adolf alban", 2 ),  
      array( "Ärmel Los", 2 ),  
      array( "Urmel aus dem Eis", 2 ),  
      array( "Ürügü Ütschügü", 2 )  
    );  
      
    function sort_callback( $a, $b )  
    {  
      // resolve reference and case issues  
      $a = strtoupper( $a[0] );  
      $b = strtoupper( $b[0] );  
      
      // trim specialchars  
      $from = array( 'Ä', 'Ö', 'Ü', 'ß' );  
      $to   = array( 'A', 'O', 'U', 'SS' );  
      str_replace( $from, $to, $a);  
      str_replace( $from, $to, $b);  
      
      // evaluate position  
      return  $a == $b ? 0 : $a > $b ? 1 : -1;  
    }  
      
    echo "<pre>";  
    print_r( $array );  
    echo "</pre>";  
    usort( $array, "sort_callback" );  
      
    echo "<pre>";  
    print_r( $array );  
    echo "</pre>";  
    ?>
    

    Das ist zwar mit Sicherheit nicht die edelste aller möglichen Lösungen, hatte mir aber damals gereicht.

    weiterhin schönen abend...

    --
    Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
    1. $array = array(
        array( "hallo welt", 1 ),
        array( "hallo wald", 2 ),
        array( "Heinrich wald", 2 ),
        array( "albert wald", 2 ),
        array( "adolf wald", 2 ),
        array( "adalbert wald", 2 ),
        array( "Adolf alban", 2 ),
        array( "Ärmel Los", 2 ),
        array( "Urmel aus dem Eis", 2 ),
        array( "Ürügü Ütschügü", 2 )
      );

      function sort_callback( $a, $b )
      {
        // resolve reference and case issues
        $a = strtoupper( $a[0] );
        $b = strtoupper( $b[0] );

      // trim specialchars
        $from = array( 'Ä', 'Ö', 'Ü', 'ß' );
        $to   = array( 'A', 'O', 'U', 'SS' );
        str_replace( $from, $to, $a);
        str_replace( $from, $to, $b);

      // evaluate position
        return  $a == $b ? 0 : $a > $b ? 1 : -1;
      }

      weiterhin schönen abend...

      hallo globe

      vielen dank für deine antwort

      ich weiss nicht an was es liegt, aber bei mir läuft das ding nicht die umlaute sind imer am schluss :-(

      langsam bin ich ordentlich frustriert

      kann das eine einstellung am server sein??
      ich hab mir $a und $b mal ausgeben lassen:

      str_replace( $from, $to, $b);
        echo $a;
        // evaluate position

      da waren die Äs Üs Ös und ß noch drin

      vielen dank trotz allem

      Gruß Rüdiger

      1. n'abend,

        da waren die Äs Üs Ös und ß noch drin

        hehe... ja.. kein wunder... ;)

        $a =   str_replace( $from, $to, $a);  
        $b = str_replace( $from, $to, $b);
        

        hätte das wohl mal werden sollen...

        weiterhin schönen abend...

        --
        Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
        sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|