ThomasP: pendant zu gt/lt in perl

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

  1. Und was amcht das Script? (Für alle nicht Perler)

    1. 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

  2. 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

    1. 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

      1. 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>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.

        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

        1. 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