Kristof: Arrays sortieren. Special case ;-)

Hallo,

ich habe ein Array $array, das so aussieht:

array(2) {
  [0]=>
  array(2) {
    ["id"]=>
    int(4)
    ["d"]=>
    float(31.4903950302)
  }
  [1]=>
  array(2) {
    ["id"]=>
    int(5)
    ["d"]=>
    float(30.1773775515)
  }
}

Dieses Array soll nach dem Wert "d" des Subarrays sortiert werden. Also im konkreten Fall so aussehen:

array(2) {
  [0]=>
  array(2) {
    ["id"]=>
    int(5)
    ["d"]=>
    float(30.1773775515)
  }
  [1]=>
  array(2) {
    ["id"]=>
    int(4)
    ["d"]=>
    float(31.4903950302)
  }
}

wie geht das?

Danke

Kristof

  1. Lieber Kristof,

    Array soll nach dem Wert "d" des Subarrays sortiert werden.

    Du suchst usort().

    usort() verlangt einen Funktionsnamen als zweiten Parameter, eine Callback-Funktion. Diese Callback-Funktion bekommt traditionell zwei zu vergleichende Werte übermittelt und muss nun einen der folgenden Werte zurückliefern:

    -1 : Der erste Wert ist kleiner als der zweite
     0 : Die Werte sind gleich groß
     1 : Der erste Wert ist größer als der zweite

    In Deinem Fall könnte das so aussehen:

    function vergleiche_d($arr1, $arr2) {  
        $wert1 = $arr1['d'];  
        $wert2 = $arr2['d'];  
        if ($wert1 < $wert2)  
            return -1;  
        if ($wert1 > $wert2)  
            return 1;  
        if ($wert1 == $wert2)  
            return 0;  
    }  
      
    $hat_geklappt = usort ($array, 'vergleiche_d');
    

    Die Callback-Funktion kann man natürlich auch kürzer schreiben:

    function vergleiche_d($arr1, $arr2) {  
        if ($arr1['d'] == $arr2['d'])  
            return 0;  
        return ($arr1['d'] < $arr2['d']) ? -1 : 1;  
    }  
      
    usort($array, 'vergleiche_d');
    

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. Nachtrag:

      Diese Callback-Funktion [...] muss nun einen der folgenden Werte zurückliefern:

      -1 : Der erste Wert ist kleiner als der zweite
      0 : Die Werte sind gleich groß
      1 : Der erste Wert ist größer als der zweite

      Das ist ungenau. Im ersten Falle muss der Wert lediglich kleiner als Null sein, es sind daher auch Werte wie -24.134 möglich.

      Umgekehrt gilt analog dasselbe für den dritten Fall: Der Wert muss größer als Null sein.

      Die Callback-Funktion kann man natürlich auch kürzer schreiben:

      Unter den oben erwähnten Umständen geht es sogar ultrakurz:

      function vergleiche_d($arr1, $arr2) {  
          return $arr2['d'] - $arr1['d'];  
      }  
        
      usort($array, 'vergleiche_d');
      

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.