pendant zu gt/lt in perl
ThomasP
- php
0 Fosca0 ThomasP
0 Jörk Behrends0 ThomasP0 Jörk Behrends0 ThomasP
Hei und HuHu! ;-)
nachdem ich nirgends eine Funktion wie gt oder lt in Perl fand und strcasecmp die Laenge des Strings zuerst beruecksichtigt, hier meine selbstgebastelte Loesung:
function stralphacmp($string1,$string2)
{
$x=0;
$ret=0;
for($x=0;(strlen($string1)<strlen($string2)) ? strlen($string1) : strlen($string2);$x++)
{
$ret=strcasecmp(substr($string1,$x,1),substr($string2,$x,1));
if(0!=$ret) break;
}
if(0==$ret)
{
(strlen($string1)<strlen($string2)) ? $ret=-1 : $ret=1;
}
return $ret;
}
nicht unbedingt optimiert, aber es funzt.
Gruß
Thomas
Und was amcht das Script? (Für alle nicht Perler)
Und was amcht das Script? (Für alle nicht Perler)
Sorry!
Es vergleicht String1 mit String2 Zeichenweise
dabei wird String1 als groesser angesehen, wenn das erste Zeichen an Stelle $x groesser ist, als das Zeichen Nr $x in String2 und umgekehrt.
Sind die Zeichen des kuerzeren Strings gleich den Zeichen des laengeren Strings, wird der laengere String als groesser angesehen
Sind beide Strings gleich, wird String2 als groesser angesehen (ist fuer Sortierung)
Der Vergleich verlaeuft case-insensitiv (keine Unterscheidung von Gross- und Kleinschreibung)
Wenn strcasecmp durch strcmp ersetzt wird, ist es case-sensitiv
Der Laengenvergleich
(strlen($string1)<strlen($string2)) ? $ret=-1 : $ret=1;
kann so umgeschrieben werden, dass bei gleicher laenge 0 zurueckgegeben wird:
if(strlen($string1)<strlen($string2))
{
$ret=-1;
}elseif(strlen($string1)>strlen($string2)){
$ret=1;
}else{
$ret=0;
}
alles klar?
Gruß
Thomas
Hallo Thomas,
Hei und HuHu! ;-)
nachdem ich nirgends eine Funktion wie gt oder lt in Perl fand und strcasecmp die Laenge des Strings zuerst beruecksichtigt, hier meine selbstgebastelte Loesung:
function stralphacmp($string1,$string2)
[...]
wie wär's denn mit:
function stralphacmp($string1,$string2)
{
$s1 = bin2hex('strtolower($string1));
$s2 = bin2hex('strtolower($string2));
return strcmp($s1, $s2);
}
Leider kann ich eigentlich gar kein PHP - könnten also noch Syntaxfehler drin sein ...
Jörk
Hallo Jörk!
Das Problem dabei ist, dass bei strcasecmp das strtolower nicht notwendig ist, da der Vergleich eh case-insensitiv durchgefuerht wird.
Der eigentliche Zweck ist es, _zuerst_ die zeichen zu vergleichen und _dann_ die Laenge einzubeziehen.
Beispiel:
strcasecmp("aaaa","bbbb") ergibt -1 also String1<String2
strcasecmp("aaaa","bb") ergibt 1 also String1>String2
wenn ich alphabetisch sortieren will, ist also das reine strcasecmp sinnlos, da ja "aaaa" _vor_ "bb" stehen muesste.
Die Funktion vergleicht also Buchstaben fuer Buchstaben und _nur_ wenn die Buchstaben gleich sind, wird die Laenge verglichen.
Das ist fuer eine alphabetische Sortierung unerlaesslich.
OK?
Gruß
Thomas
Thomas,
Das Problem dabei ist, dass bei strcasecmp das strtolower nicht notwendig ist, da der Vergleich eh case-insensitiv durchgefuerht wird.
Der eigentliche Zweck ist es, _zuerst_ die zeichen zu vergleichen und _dann_ die Laenge einzubeziehen.Beispiel:
strcasecmp("aaaa","bbbb") ergibt -1 also String1<String2
strcasecmp("aaaa","bb") ergibt 1 also String1>String2wenn ich alphabetisch sortieren will, ist also das reine strcasecmp sinnlos, da ja "aaaa" _vor_ "bb" stehen muesste.
Die Funktion vergleicht also Buchstaben fuer Buchstaben und _nur_ wenn die Buchstaben gleich sind, wird die Laenge verglichen.
Das ist fuer eine alphabetische Sortierung unerlaesslich.
Das Prinzip ist mir soweit klar! Meinst Du denn jetzt, daß meine Variante nicht funktionieren wird? Was ist denn so schlimm daran, daß ich mit strtolower gearbeitet habe? Ich fand meine Umsetzung halt recht kurz und prägnant ...
Jörk
Hallo Jörk!
Nimms mir nicht uebel, aber Du kannst wirklich kein PHP. ;-)
Ich kanns zwar auch noch nicht perfekt, aber:
strcasecmp beinhaltet bereits strtolower in dem Sinne, dass zwischen Gross- und Kleinschreibung nicht unterschieden wird.
weiterhin vergleicht strcmp und strcasecmp auch und in erster Linie die Laenge der Strings.
das soll aber vermieden werden, da auch ein laengerer String alphabetisch _vor_ einem kuerzeren String stehen kann
meine Funktion haelt also genau diese Reihenfolge ein _erst_ nach alphabet und _dann_ erst nach Laenge, wenn noetig.
jetzt verstanden?
Gruß
Thomas
PS: ich habe es probiert, da ich das momentan fuer ein Script brauche