tipper: Wie Array sortieren

Hallo zusammen,
ich verzweifele zur Zeit beim sortieren eines mehrdimensionalen Arrays.

  
Array  
(  
    [0] => Array  
        (  
            [points] => Array  
                (  
                    [points_amount] => 74  
                    [four_pointer] => 7  
                    [two_pointer] => 13  
                )  
  
            [gname] => Spieler  
            [sname] => 1  
        )  
  
    [1] => Array  
        (  
            [points] => Array  
                (  
                    [points_amount] => 45  
                    [four_pointer] => 4  
                    [two_pointer] => 4  
                )  
  
            [gname] => Spieler  
            [sname] => 2  
        )  
  
    [2] => Array  
        (  
            [points] => Array  
                (  
                    [points_amount] => 73  
                    [four_pointer] => 8  
                    [two_pointer] => 13  
                )  
  
            [gname] => Spieler  
            [sname] => 3  
        )  
  
    [3] => Array  
        (  
            [points] => Array  
                (  
                    [points_amount] => 70  
                    [four_pointer] => 10  
                    [two_pointer] => 6  
                )  
  
            [gname] => Spieler  
            [sname] => 4  
        )  
  
    [4] => Array  
        (  
            [points] => Array  
                (  
                    [points_amount] => 73  
                    [four_pointer] => 8  
                    [two_pointer] => 6  
                )  
  
            [gname] => Spieler  
            [sname] => 5  
        )  
  
    [5] => Array  
        (  
            [points] => Array  
                (  
                    [points_amount] => 51  
                    [four_pointer] => 3  
                    [two_pointer] => 4  
                )  
  
            [gname] => Spieler  
            [sname] => 6  
        )  
  
)

Ich möchtenun eine Tabelle ausgeben, wo die Spieler nach points_amount, four_pointer, two_pointer sortiert sind. Also in diesem Fall:
1. Spieler 1 | 74 | 07 | 13
2. Spieler 3 | 73 | 08 | 13
3. Spieler 5 | 73 | 08 | 6
4. Spieler 4 | 70 | 10 | 6
5. Spieler 6 | 51 | 03 | 4
6. Spieler 2 | 45 | 04 | 4

ich blicke aber bei den sortierfunktionen bei PHP absolut nicht durch, welches wäre die richtige für dieses Problem?

Bin für jede Hilfe dankbar

Grüße
tipper

  1. Moin,

    ich blicke aber bei den sortierfunktionen bei PHP absolut nicht durch, welches wäre die richtige für dieses Problem?

    Ich hatte das selbe Problem und hab eine Funktion gefunden, die funktioniert hat:

    function array_sort($array, $on, $order=SORT_ASC) {  
    	$new_array = array();  
    	$sortable_array = array();  
    	if (count($array) > 0) {  
    		foreach ($array as $k => $v) {  
    			if (is_array($v)) {  
    				foreach ($v as $k2 => $v2) {  
    					if ($k2 == $on) {  
    						$sortable_array[$k] = $v2;  
    					}  
    				}  
    			} else {  
    				$sortable_array[$k] = $v;  
    			}  
    		}  
    		switch ($order) {  
    			case SORT_ASC:  
    				asort($sortable_array);  
    			break;  
    			case SORT_DESC:  
    				arsort($sortable_array);  
    			break;  
            }  
    		foreach ($sortable_array as $k => $v) {  
    			$new_array[$k] = $array[$k];  
    		}  
    	}  
    	return $new_array;  
    }
    

    Woher, weiß ich leider nicht mehr.
    $array => das zu sortierende Array
    $on => Sortierkriterium
    $order => SORT_ASC | SORT_DESC (auf- oder absteigend)

    Grüße Marco

    1. Moin!

      ich blicke aber bei den sortierfunktionen bei PHP absolut nicht durch, welches wäre die richtige für dieses Problem?

      Ich hatte das selbe Problem und hab eine Funktion gefunden, die funktioniert hat:

      Für welches Sortierproblem?

      Nur weil "Sortierfunktion" draufsteht, heißt das noch lange nicht, dass damit das Problem gelöst ist.

      Woher, weiß ich leider nicht mehr.
      $array => das zu sortierende Array
      $on => Sortierkriterium
      $order => SORT_ASC | SORT_DESC (auf- oder absteigend)

      Wenn du nicht weißt und angeben kannst, welche Input-Struktur erforderlich ist, und welcher Output zu erwarten ist, schmeiß den Code lieber weg...

      - Sven Rautenberg

      1. Moin,

        Wenn du nicht weißt und angeben kannst, welche Input-Struktur erforderlich ist, und welcher Output zu erwarten ist, schmeiß den Code lieber weg...

        Langsam... Code wegschmeißen? Soll ich jedesmal, wenn ich so ein Array sortieren will zu Fuß gehen? Sicher nicht.
        Ich habe viele solche Arrays, deren assoziativen Datensätze hinter einem Index liegen, also in der Form:

        Array(
          [0] => Array ( [id] => 123 [name] => "name" ...)
          [1] => Array ( [id] => 1234 ...)
          ...
        )

        Und diese lassen sich mit der Funktion sehr gut sortieren. Was ich allerdings in diesem konkreten Fall nicht bedacht habe, ist, dass die Sortierkriterien noch eine Stufe weiter unten zu finden sind. Dafür lässt sich die Funktion aber anpassen.

        Grüße Marco

        1. Tach!

          Langsam... Code wegschmeißen? Soll ich jedesmal, wenn ich so ein Array sortieren will zu Fuß gehen? Sicher nicht.

          Der Aufwand, das zu Fuß zu machen, hält sich sehr in Grenzen und es ist weniger Aufwand, als das Array dreimal umzuformen:

          uasort(  
            $array,  
            function($a, $b) {  
              return strcmp($a['irgend']['ein']['key'], $b['irgend']['ein']['key']);  
            }  
          );
          

          Variationsmöglichkeiten:

          • strcmp() hat einige Geschwister, zum Beispiel um Groß-/Kleinschreibung zu ignorieren, oder Zahlen "natürlich" zu sortieren.
          • Sortierreihenfolge umdrehen? $a und $b austauschen (an einer Stelle, nicht an beiden)
          • Für PHP < 5.3 muss die Vergleichsfunktion separat definiert werden, oder mit create_function()
          • Die Vergleichsfunktion kann auch deutlich komplexer ausfallen, als mit einer Nur-ein-Key-als-String-Sortierfunktion möglich ist. Letztere für mehr Anwendungsmöglichkeiten umzuschreiben, macht sie auch nicht einfacher als eine gleichwertige Zu-Fuß-Methode.

          dedlfix.

          1. Moin,

            uasort(

            $array,
              function($a, $b) {
                return strcmp($a['irgend']['ein']['key'], $b['irgend']['ein']['key']);
              }
            );

              
            Man wird alt wie ein Haus, ... :-P  
              
            Das kannte ich noch nicht, danke.  
              
            Grüße Marco
            
  2. Tach!

    ich verzweifele zur Zeit beim sortieren eines mehrdimensionalen Arrays.

    Die Bezeichung "mehrdimensionales Array" für baumstrukturierte Daten ist irreführend und auch nicht korrekt. Konkret hast du ein Array mit Datensätzen. Diese sind assoziative Arrays und haben (vielleicht sogar unnötigerweise) einen Eintrag, der weitere Daten in Form eines weiteren assoziativen Arrays bündelt. Also ein Baum und kein in mehrere Dimensionen gleichmäßig strebendes Gebilde.

    ich blicke aber bei den sortierfunktionen bei PHP absolut nicht durch, welches wäre die richtige für dieses Problem?

    Solche Strukturen kann man nun beliebig verästeln und es wäre ein Unding, für alle möglichen Strukturen eine Sortierfunktion bereitzustellen. Deshalb gibt es neben den für einfache Arrays geeigneten Sortierfunktionen die u-Varianten, denen man eine benutzerdefinierte Vergleichsfunktion übergeben kann. In dieser bekommst du jeweils zwei Elemente des Arrays und vergleichst da die für dich relevanten Einträge. (array_multisort() gibts auch noch, aber das lass mal lieber unbeachtet. Es arbeitet mit einer realtiv ungebräuchlichen Datenstruktur und ist für deine nicht direkt verwendbar.)

    dedlfix.