Ankündigung

Einklappen
Keine Ankündigung bisher.

Mehrdimensionales Array nach x Gesichtspunkten sortieren

Einklappen

Neue Werbung 2019

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

  • Mehrdimensionales Array nach x Gesichtspunkten sortieren

    Hallo PHP.de Community,

    ich habe ein Problem mit der Sortierung eines Arrays. Ich möchte es nach diesen Kriterien sortieren:

    points absteigend
    bonus_points absteigend
    wins absteigend
    top_5 absteigend
    top_10 absteigend

    Ich habe eine Funktion anhand eines Codeschnipsel geschrieben, der points und bonus_points sortieren konnte. Muss ich jetzt noch an den Return Werten spielen? Oder gibt es da einfachere Lösungen als verschachtele If Strukturen?

    PHP-Code:
    <?

    function sort_driver_array($a, $b) {
        if ($a['points'] == $b['points'] && $a['bonus_points'] == $b['bonus_points'] && $a['wins'] == $b['wins'] && $a['top_5'] == $b['top_5']) {
            if ($a['top_10'] > $b['top_10']) return 1;
        } else if ($a['points'] == $b['points'] && $a['bonus_points'] == $b['bonus_points'] && $a['wins'] == $b['wins']) {
            if ($a['top_5'] > $b['top_5']) return 1;
        } else if ($a['points'] == $b['points'] && $a['bonus_points'] == $b['bonus_points']) {
            if ($a['wins'] > $b['wins']) return 1;
        } else     if ($a['points'] == $b['points']) {
            if ($a['bonus_points'] > $b['bonus_points']) return 1;
        }
        return $a['points'] < $b['points'] ? 1 : -1;
    }

    $standing_array = array();
    $standing_array[] = array("name" => "Platz 6", "points" => "60", "bonus_points" => "20", "wins" => "16", "top_5" => "0", "top_10" => "8");
    $standing_array[] = array("name" => "Platz 4", "points" => "80", "bonus_points" => "20", "wins" => "16", "top_5" => "0", "top_10" => "0");
    $standing_array[] = array("name" => "Platz 2", "points" => "100", "bonus_points" => "5", "wins" => "19", "top_5" => "0", "top_10" => "0");
    $standing_array[] = array("name" => "Platz 3", "points" => "100", "bonus_points" => "0", "wins" => "4", "top_5" => "0", "top_10" => "0");
    $standing_array[] = array("name" => "Platz 1", "points" => "100", "bonus_points" => "10", "wins" => "1", "top_5" => "2", "top_10" => "8");
    $standing_array[] = array("name" => "Platz 5", "points" => "60", "bonus_points" => "20", "wins" => "16", "top_5" => "0", "top_10" => "10");

    echo "<pre>";
    print_r($standing_array);
    echo "</pre>";

    echo "<p>";

    usort($standing_array, "sort_driver_array");

    echo "<pre>";
    print_r($standing_array);
    echo "</pre>";

    ?>

  • #2
    Oder gibt es da einfachere Lösungen als verschachtele If Strukturen?
    http://php.net/array-multisort

    Kommentar


    • #3
      Oh: Mal ein User der seinen Code in PHP-Tags stellt und noch dazu eine Datenbasis zum Test liefert, leider zu selten hier (für ein Syntax-Highlighting muss das <? vorne weg).

      Das multisort kann so sehr übersichtlich geschrieben werden:
      PHP-Code:
      array_multisort(
        
      array_column($standing_array,"points"), SORT_DESC,
        
      array_column($standing_array,"bonus_points"),  SORT_DESC,
        
      array_column($standing_array,"wins"),  SORT_DESC,
        
      array_column($standing_array,"top_5"),  SORT_DESC,
        
      array_column($standing_array,"top_10"),  SORT_DESC,
        
      $standing_array
      ); 

      LG jspit

      Kommentar


      • #4
        Danke für den Ansatz,
        hatte auf php.net nur den Ansatz mit for Schleife gesehen.

        Wie jspit es schreibt funktioniert es perfekt

        Kommentar


        • #5
          Zitat von chogger Beitrag anzeigen
          hatte auf php.net nur den Ansatz mit for Schleife gesehen.
          Das wurde wahrscheinlich geschrieben, bevor es array_column() gab.

          Kommentar

          Lädt...
          X