Der-Dennis: Wiki-Artikel: Gruppenwechsel

Beitrag lesen

Hallo dedlfix,

danke Dir für die Antwort.

  • Findet ihr das Schulbeispiel passt? Gibt's bessere Ideen?

Tiere gehen auch immer.

Ok, dann nehme ich Tiere. Wobei der Übergang zwischen Schülern und Tieren manchmal fließend sein kann ;-)

  • Untenstehend ein paar Beispiele für mögliche Beispiele 1. Ordnung. Welches ist am verständlichsten? Welches ist nicht so gut? Habt ihr andere Vorschläge? Mein Problem ist einfach, wie kann ich das einigermaßen einheitlich über die drei Ordnungen hinkriegen und auch so, dass es ein Laie versteht!? Es gibt einfach viel zu viele Möglichkeiten...

Erst was ganz einfaches, dann kann auch was komplexeres in einem nächsten Abschnitt folgen.

Das war der ursprüngliche Plan, mehr dazu unten.

// Wenn die Daten wie hier nicht sortiert vorliegen, müssen diese nach ihrer Gruppe sortiert werden.

Das sollte einfach Voraussetzung sein und nur erwähnt werden (vielleicht hervorgehoben). Eine Sortierung selbst muss nicht gezeigt werden, besonders nicht mit so einer umstrittenen Funktion wie array_multisort(). Die Beispieldaten können ruhig (erkennbar) sortiert vorliegen.

Ok, machen wir so. Hatte eh mit Einspruch gerechnet ;-)

array_multisort($schueler);

Das sortiert zwar augenscheinlich wie gewünscht, aber der Fall "Sortieren eines Arrays mit Datensatz-Arrays" ist im PHP-Handbuch gar nicht erwähnt. Da steht, dass man das Zeilen-Array erstmal zu einem Spalten-Array umformen muss.

Dachte mir schon, dass hier Einspruch kommt :-) Hatten wir da nicht sogar vor Ewigkeiten mal drüber gesprochen? Kommt wieder weg. Ich weiß auch gar nicht, wann ich die Funktion das letzte Mal benutzt habe. Wollte nur kein Fass aufmachen und kurz zeigen, dass die sortiert werden müssen. Aber hat sich erledigt, mache ich im Text.

  • Vorschlag 1: Vollständiges Beispiel

Muss das mit zwei verschachtelten for-Schleifen ablaufen? Geht das nicht auch einfacher mit foreach zu lösen?

Nein und ja. Muss nicht und geht. Warum zwei for-Schleifen? Ich hatte mir angeguckt, wie die Theorie zum Gruppenwechsel aussieht. In der Theorie stehen praktisch überall zwei Schleifen. Der Sinn hat sich mir zwar noch nicht erschlossen, wollte es aber ursprünglich erstmal so reinbringen und später zeigen, dass es auch anders geht. Z.B. bei Wikipedia kannst Du Dir ja mal das Struktogramm ansehen, in den anderen allgemeingültigen Abhandlungen findet man ähnliches.

Ansonsten ist ein einfacher Gruppenwechsel ja nichts Wildes:

$gruppe = '';
foreach ($elemente as $element) {
  if ($element['gruppe'] != $gruppe) {
    echo $element['gruppe'];
    $gruppe = $element['gruppe'];
  }
  echo $element['name'];
}
  • Vorschlag 2
  • Vorteil: Nur eine Schleife
  • Nachteil: Aufteilung Gruppenvor-, -durch-, und -nachlauf nicht klar ersichtlich; einiges doppelt; einfach erweiterbar

Das bekommt man auch ohne Dopplungen hin.

Ja.

$schule = $schueler[0]['schule']; $namenDerSchueler = array(); $namenDerSchueler[] = $schueler[0]['name']; $anzahlDerSchueler = 1;

Lediglich $schule muss mit einem nicht vorkommenden Wert initialisiert werden, beispielsweise null. Der erste Datensatz erzeugt daraufhin gleich einen Gruppenwechsel von nichts in die erste Gruppe. Es reicht, wenn dann die gruppenspezifischen Initialisierungen stattfinden.

Stimmt. Da ist aber das "Problem", dass dann im weiteren Verlauf die Reihenfolge Vorlauf-Durchlauf-Nachlauf nicht mehr hinhaut. Da wollte ich ursprünglich drauf hinaus, weil das die theoretische Reihenfolge ist. In vielen Fällen dürfte man aber eher sowas wie Nachlauf-Vorlauf-Durchlauf haben.

Der Fall ist der einfachste. Wenn nur vor einer Gruppe etwas ausgegeben werden muss, ist der sehr gut geeignet. Wenn eine Gruppe auch noch abgeschlossen werden muss, ist das vor der Gruppen-Initialisierung zu tun. Auf den ersten Pseudo-Wechsel wäre zu prüfen und dann der Abschluss zu unterlassen. Am Ende sollte auch noch ein Abschluss stattfinden - na gut, dann bekommt man da eine Dopplung rein.

So würde man es häufig - trotz Doppelung - wohl auch machen.

  • Vorschlag 3 $schulenSortiert[$schueler[$i]['schule']]['anzahl'] = 0;

Wenn du schon ein verschachteltes/gruppiertes Array anlegst, kannst du auch mit count() zählen.

Ja, gleiches Problem wie zuvor: Ich wollte zeigen, dass sowas wie "gruppenspezifische Eigenschaften" im Vorlauf initialisiert und dann z.B. hochgezählt werden, auch wenn man das praktisch nicht so macht.

Nach ein bisschen Nachdenken komme ich aber zu dem Schluss, dass das, was ich vorhatte, so bestimmt nicht sinnvoll möglich ist. Ich wollte nämlich die (sowieso etwas fragwürdige) Theorie auch in den Beispielen unterbringen und zusätzlich halbwegs praxistaugliche Beispiele haben, die zusätzlich noch leicht zu verstehen sind. Ich denke, das funktioniert so nicht.

Deshalb eine weitere Frage an Euch: Worauf soll ich mich konzentrieren? Möchten wir einen Artikel "Programmiertechnik/Gruppenwechsel" (das wäre dann eher theoretisch) oder einen Artikel "PHP/Gruppenwechsel" (dann eher praktisch). Oder habt ihr sonst noch einen Vorschlag?

Gruß Dennis