Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit Vergleichsfunktion bei uasort()

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit Vergleichsfunktion bei uasort()

    Hallo,

    ich habe folgendes Array innerhalb einer Klasse:
    Code:
    array(
    key1 => array(ukey1 => val1, ukey2 => val2,  ... , ukey6 => val6),
    key2 => array(ukey1 => val1, ukey2 => val2,  ... , ukey6 => val6),
    ...
    )
    So, nun will ich dieses Array nach den verschiedenen vals sortieren. Dazu will ich uasort verwenden mit z. B. folgender Vergleichsfunktion für val1:
    Code:
    function cmp_ukey1($x, $y)
    {
     if (strcmp($x['ukey1'], $y['ukey1']) == 0)
      return 0;   	
     return (strcmp($x['ukey1'], $y['ukey1']) < 0) ? -1 : 1;
    }
    Der Aufruf und die Ausgabe erfolgen dann weiter unten via
    Code:
    uasort($this->arrayname, "cmp_ukey1");
    foreach($this->arrayname as $id => $arr)
    ...
    Aber der Interpreter beschwert sich dann jedesmal mit
    Warning: uasort(): Invalid comparison function.

    Was stimmt da noch nicht?

  • #2
    PHP-Code:
    <?php
    $arr 
    = array(
    key1 => array(ukey1 => val1ukey2 => val2,  ukey6 => val6),
    key2 => array(ukey1 => val1ukey2 => val2,  ukey6 => val6)
    );

    function 
    cmp_ukey1($x$y)
    {
     if (
    strcmp($x['ukey1'], $y['ukey1']) == 0)
      return 
    0;
     return (
    strcmp($x['ukey1'], $y['ukey1']) < 0) ? -1;
    }

    uasort($arr"cmp_ukey1");
    foreach(
    $arr as $key => $value) {
        print 
    "$key => $value
    "
    ;
    }
    ?>
    Hiermit bekomme ich keinen Fehler. Ob die Sortierung nach deinen Wünschen funktioniert weiß ich allerdings nicht.

    Ist cmp_ukey() denn wirklich als Funktion oder doch als Methode deklariert?


    (Fred verschoben: Parser-Fehler)

    Kommentar


    • #3
      Arghh, hatte sie tatsächlich als Methoden implementiert. Als Funktionen klappen sie wunderbar, vielen Dank für den wertvollen Tipp! Und sorry wegen der Forenverwechslung.

      Kommentar


      • #4
        Du kannst es auch als Methode definieren.
        Entweder gibst Du dann das passende Objekt mit an. Dann darfst Du $this in der Methode verwenden.
        Oder Du gibst den Klassennamen zu einer statischen Methode an.

        PHP-Code:
        uasort($this->arr, array($this'compMethod'));
        uasort($this->arr, array('Classname''staticCompMethod')); 

        Kommentar


        • #5
          Wieso findet man solche hilfreichen Erklärungen im Handbuch nicht. Oder war ich einfach nur zu blind? Danke jedenfalls!

          Kommentar


          • #6
            Das steht leider nicht an allen Stellen im Handbuch.
            Aber das funktioniert bei allen(?) callbacks in php: http://de.php.net/manual/en/language...types.callback

            Kommentar


            • #7
              War mir auch neu.

              Kommentar


              • #8
                Zitat von Bruchpilot
                Das steht leider nicht an allen Stellen im Handbuch.
                Aber das funktioniert bei allen(?) callbacks in php: http://de.php.net/manual/en/language...types.callback
                Streich mal in Gedanken das allen. Oder mach daraus ein "bei allen gängigen"
                Leider kommt es wirklich auf die Extension drauf an. Bei den Standard-Callbacks, wie insbesondere den Array- oder Fehlerhandlern klappt das. Bei "exotischeren" Extensions sollte man sich nicht drauf verlassen bzw. es mal ausprobieren.

                Kommentar


                • #9
                  Zitat von Bruchpilot
                  Das steht leider nicht an allen Stellen im Handbuch.
                  Aber das funktioniert bei allen(?) callbacks in php: http://de.php.net/manual/en/language...types.callback
                  Vielen Dank für diesen Link, der war und ist Gold wert

                  Kommentar

                  Lädt...
                  X