alphabetisches sortieren von mehrdimensionalen arrays
Rüdiger L
- php
0 Der Martin
0 Rüdiger L0 Rüdiger L0 Der Martin
0 wahsaga
0 globe
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
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
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
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
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
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
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...
$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
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...