Mario: mehrdimensionales Array mit "uasort" sortieren

Ich habe folgendes Array:

$arr[0][0]="Hallo_00";
$arr[0][1]="Hallo_01";
$arr[0][2]="Hallo_02";

$arr[1][0]="Hallo_10";

$arr[2][0]="Hallo_20";
$arr[2][1]="Hallo_21";
$arr[2][2]="Hallo_22";
$arr[2][3]="Hallo_23";

$arr[3][0]="Hallo_30";
$arr[3][1]="Hallo_31";

// Ich möchte es mit ...

uasort($arr, "spez_sort");

function spez_sort ($dat1, $dat2){
  $retdat = 0;
  if(count(?????) > count(?????)) $retdat = 1;
  else if(count(?????) < count(?????)) $retdat = -1;
  return $retdat;
}

// ... so sortieren, das es nach der Anzahl/Menge ( count($arr[?????]) der Elemente im ersten Schlüssel absteigend sortiert ist:

$arr[2][0]="Hallo_20";
$arr[2][1]="Hallo_21";
$arr[2][2]="Hallo_22";
$arr[2][3]="Hallo_23";

$arr[0][0]="Hallo_00";
$arr[0][1]="Hallo_01";
$arr[0][2]="Hallo_02";

$arr[3][0]="Hallo_30";
$arr[3][1]="Hallo_31";

$arr[1][0]="Hallo_10";

Vielen Dank,

Mario

  1. Moin!

    // Ich möchte es mit ...

    uasort($arr, "spez_sort");

    Mach doch einfach. :)

    function spez_sort ($dat1, $dat2){
      $retdat = 0;
      if(count(?????) > count(?????)) $retdat = 1;
      else if(count(?????) < count(?????)) $retdat = -1;
      return $retdat;
    }

    count($dat1) und ($dat2) ergeben die Anzahl der Elemente der zweiten Dimension

    Bedenke, dass deine Sortierfunktion -1, 0 oder 1 zurückliefern muß!

    - Sven Rautenberg

    1. Hallo Sven,

      schön das Du geantwortet hast, ich hatte im Archiv schon zwei von Dir beantwortete Einträge zum Thema mehrdimensionale Arrays gefunden, die aber mein Problem nicht lösten.

      Die Rückgabe )0,1,-1) würde funktionieren. Was ich aber nicht verstehe ist, es sollen ja insgesamt nur vier "Schlüssel" verglichen werden. Vier mal sollen die Unterschlüssel gezählt und miteinander verglichen werden.
      1. Kann ich mit Count die Unterschlüssel zählen?
      2. Ich komme mit $dat1 und $dat2 nicht klar, woher weiß uasort, was ich ihm übergebe (das was zu zählen ist?, das was zu vergleichen ist?)

      Vielleicht kannst Du mir helfen.

      1. Moin!

        Die Rückgabe )0,1,-1) würde funktionieren. Was ich aber nicht verstehe ist, es sollen ja insgesamt nur vier "Schlüssel" verglichen werden. Vier mal sollen die Unterschlüssel gezählt und miteinander verglichen werden.

        1. Kann ich mit Count die Unterschlüssel zählen?
        2. Ich komme mit $dat1 und $dat2 nicht klar, woher weiß uasort, was ich ihm übergebe (das was zu zählen ist?, das was zu vergleichen ist?)

        Die Grundlage aller Sortierfunktionen, die es gibt, ist "vergleichen" und "austauschen".

        Für das Vergleichen ist deine eigene Funktion zuständig, den Rest (das Durcharbeiten des Arrays und das Austauschen) erledigt die Sortierfunktion.

        Das bedeutet: Die Sortierfunktion wird immer zwei Elemente des Arrays nehmen, sie deiner Vergleichsfunktion übergeben, und als Ergebnis erhalten, ob das erste oder das zweite Element weiter "vorne" in der Sortierlogik einzuordnen ist. Entsprechend wird es dann getauscht werden. Am Ende ist das Array sortiert - welche Elemente im einzelnen miteinander verglichen werden müssen, muß dich nicht interessieren, das ist Aufgabe der Sortierfunktion, und außerdem gibt es da diverse Algorithmen für, welche sich insbesondere in der Geschwindigkeit stark unterscheiden können.

        Wichtige Begriffe sind also "Das Array", "einzelnes Arrayelement" und "Vergleich".

        "Das Array" ist dein Gesamtkonstrukt in $arr. Das heißt zwar "zweidimensionales Array", aber tatsächlich ist es ein eindimensionales Array von eindimensionalen Arrays, also Arrays im Array.

        Dementsprechend ist ein einzelnes Arrayelement von $arr wiederum ein eigenständiges Array, auf das man natürlich alle Arrayfunktionen anwenden kann.

        Beim Sortieren werden deiner Vergleichsfunktion zwei Elemente deines Arrays $arr übergeben. Das bedeutet, die Sortierfunktion erwartet eine Funktion mit zwei Parametern. Deine Funktion muß nun durch den Rückgabewert sagen, ob der erste Parameter weiter nach vorn sortiert werden soll (Rückgabe -1), oder der zweite (Rückgabe 1), oder ob beide Parameter gleich sind (Rückgabe 0).

        Ein Arrayelement, der den Parametern übergeben wird, besteht dabei aus genau dem Inhalt, den du auch erhälst, wenn du auf $arr[0] etc. zugreifst.

        Kannst du ja mal ausprobieren. Es gibt die wunderbare Funktion "var_dump", welche dir direkt die Inhalte von Variablen ausgibt. Da diese Funktion kein HTML erzeugt, solltest du deren Ergebnis in <pre> einfassen, damit der Browser was lesbares anzeigt:

        echo "<pre>";
        var_dump($arr)
        echo "</pre>";

        Das zeigt dir dein Gesamtarray an.

        Nimmst du stattdessen
        var_dump($arr[0])

        dann siehst du, welche Informationen in einer der Sortierfunktionsparameter drinstehen. Du kriegst ein Array - und dessen Elemente kannst du mit Count zählen.

        - Sven Rautenberg