Der-Dennis: Wiki-Artikel: Gruppenwechsel

Beitrag lesen

Hallo zusammen,

da ich mich heute hier aus dem Fenster gelehnt habe, benötige ich Eure Meinung zum neuen Wiki-Artikel Gruppenwechsel.

Der Artikel an sich stellt kein großes Problem dar, vielmehr (wie in den meisten Fällen) das Erstellen von einfachen Beispielen.

Ich habe mir folgendes überlegt: Für Gruppenwechsel 1., 2. und 3. Ordnung (spätestens dann sollte das Prinzip klar sein) werden Schulen "Gruppenwechseltechnisch" (was für ein Wort... ;)) bearbeitet.

  • 1. Ordnung: Schüler einer Schule
  • 2. Ordnung: Schüler eines Jahrgangs einer Schule
  • 3. Ordnung: Schüler einer Klasse eines Jahrgangs einer Schule

Meine Idee ist, dass alle drei Fälle "einheitlich" behandelt werden und, natürlich, leicht verständlich sind. Der Vollständigkeit halber: Als letztes Beispiel (n. Ordnung) soll ein Stammbaum (Vater-Sohn-Beziehung) erklärt werden und warum dies bei einer begrenzten Anzahl von Stufen mittels Gruppenwechsel zwar möglich, aber "nicht besonders klug" ist.

Nun mein Problem: Sowas wie ein Gruppenwechsel kommt ja immer mal wieder vor, allerdings habe ich mir darüber noch nie Gedanken gemacht (sondern es "einfach gemacht") und finde daher kein schönes Beispiel.

Deshalb meine Fragen:

  • Findet ihr das Schulbeispiel passt? Gibt's bessere Ideen?
  • 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...

Das Daten-Array (für Ordnung 2 käme dann ein Eintrag "Jahrgang" je Schüler hinzu. Für Ordnung 3 ein Eintrag "Klasse" je Schüler):

#### INITIALISIERUNG ####
// In der Initialisierungsphase werden die Daten z.B. aus einer Datei oder Datenbank geholt und
// aufbereitet, da die Daten für einen Gruppenwechsel sortiert vorliegen müssen. Außerdem wird
// eine Schleife, welche alle Schüler durchläuft, gestartet.

// Alle Schüler aller Schulen, z.B. aus einer Datei oder Datenbank
$schueler = array();
$schueler[] = array('schule' => 'Geschwister-Scholl-Schule', 'name' => 'Emma');
$schueler[] = array('schule' => 'Geschwister-Scholl-Schule', 'name' => 'Ben');
$schueler[] = array('schule' => 'Albert-Schweitzer-Schule',  'name' => 'Finn');
$schueler[] = array('schule' => 'Albert-Schweitzer-Schule',  'name' => 'Lena');
$schueler[] = array('schule' => 'Geschwister-Scholl-Schule', 'name' => 'Mia');
$schueler[] = array('schule' => 'Geschwister-Scholl-Schule', 'name' => 'Hannah');
$schueler[] = array('schule' => 'Albert-Schweitzer-Schule',  'name' => 'Noah');
$schueler[] = array('schule' => 'Geschwister-Scholl-Schule', 'name' => 'Luis');
$schueler[] = array('schule' => 'Geschwister-Scholl-Schule', 'name' => 'Paul');
$schueler[] = array('schule' => 'Geschwister-Scholl-Schule', 'name' => 'Sofia');
$schueler[] = array('schule' => 'Geschwister-Scholl-Schule', 'name' => 'Lukas');
$schueler[] = array('schule' => 'Albert-Schweitzer-Schule',  'name' => 'Lea');
$schueler[] = array('schule' => 'Albert-Schweitzer-Schule',  'name' => 'Emily');
$schueler[] = array('schule' => 'Albert-Schweitzer-Schule',  'name' => 'Elias');
$schueler[] = array('schule' => 'Geschwister-Scholl-Schule', 'name' => 'Emilia');
$schueler[] = array('schule' => 'Albert-Schweitzer-Schule',  'name' => 'Luca');
$schueler[] = array('schule' => 'Geschwister-Scholl-Schule', 'name' => 'Jonas');
$schueler[] = array('schule' => 'Geschwister-Scholl-Schule', 'name' => 'Anna');
$schueler[] = array('schule' => 'Albert-Schweitzer-Schule',  'name' => 'Marie');
$schueler[] = array('schule' => 'Geschwister-Scholl-Schule', 'name' => 'Leon');

// Wenn die Daten wie hier nicht sortiert vorliegen, _müssen_ diese nach ihrer Gruppe sortiert werden.
// In den meisten Fällen (z.B. bei Daten aus einer Datei oder Datenbank) werden die Daten ähnlich wie
// hier als Zeilen-Array ausgegeben.
// Hinweis: Die interne Vorgehensweise von array_multisort() ist nicht immer intuitiv erfassbar. Es
//          gibt andere Methoden, um Datensätze zu sortieren. In diesem Fall kann es aber einfach
//          verwendet werden: Es wird zuerst aufsteigend nach Schule (notwendig für den Gruppenwechsel)
//          und anschließend aufsteigend nach Name (für den Gruppenwechsel nicht notwendig) sortiert.
array_multisort($schueler);

Die Schul- und Schülernamen übrigens ganz unverfänglich hier und hier her.

  • Vorschlag 1: Vollständiges Beispiel
  • Vorteil: Aufteilung Gruppenvor-, -durch-, und -nachlauf sind klar ersichtlich; nahezu genau "die Theorie"
  • Nachteil: Die Vor- und Zurückzählung der Zählervariablen; schlecht auf die anderen Ordnungen erweiterbar (dann sehr unübersichtlich)
// Durchlaufe alle Schüler
for ($i = 0; $i < count($schueler); $i++) {
	
	#### GRUPPENVORLAUF ####
	// Beim Gruppenvorlauf wird die Gruppe initialisiert, d.h. es werden z.B. Variablen, welche die
	// Eigenschaften der Gruppe beschreiben, definiert
	
	// Der Name der Schule
	$schule = $schueler[$i]['schule'];

	// Die Namen aller Schüler dieser Schule (die Schule ist die aktuell verwendete Gruppe)
	$namenDerSchueler = array();
	
	// Da es sich hier um die Gruppeninitialisierung handelt gehört der Schüler auch zu dieser Schule
	$namenDerSchueler[] = $schueler[$i]['name'];
	
	// Aktuell wurde 1 Schüler dieser Schule gefunden
	$anzahlDerSchueler = 1;

	#### GRUPPENDURCHLAUF ####
	// Beim Gruppendurchlauf werden alle Elemenete der aktuellen Gruppe durchlaufen, in diesem Fall also
	// alle Schüler dieser Schule
	// Da der erste Schüler der Schule bereits gefunden wurde wird direkt mit dem nächsten Schüler
	// fortgefahren, also $i+1
	for ($j = $i + 1; $j < count($schueler); $j++) {
		
		// Die Einleitung des Gruppenwechsels
		// Der aktuelle Schüler gehört einer anderen Schule an, daher kann die innere Schleife abgebrochen
		// werden. Es folgt der Gruppennachlauf, anschließend der eigentliche Gruppenwechsel
		if ($schule != $schueler[$j]['schule']) {
			break;
		}
		
		// Den Namen des aktuellen Schülers der Schule hinzufügen (gleiche Gruppe)
		$namenDerSchueler[] = $schueler[$j]['name'];
		
		// Anzahl der Schüler dieser Schule um 1 erhöhen
		$anzahlDerSchueler++;
	}
	
	#### GRUPPENNACHLAUF ####
	// Der Gruppennachlauf dient bspw. der Ausgabe der Eigenschaften der zuvor durchsuchten Gruppe
	
	// Name der Schule ausgeben
	printf('Schule: %s<br>', $schule);
	
	// Anzahl der Schüler dieser Schule ausgeben
	printf('-- Anzahl Schüler: %s<br>', $anzahlDerSchueler);
	
	// Die Namen aller Schüler dieser Schule ausgeben
	printf('-- Schüler: %s<br>', implode(', ', $namenDerSchueler));
	
	// Der aktuell bearbeitete Schüler gehörte bereits der nächsten Gruppe (einer anderen Schule) an.
	// Deshalb muss der Schüler $i erneut berechnet werden ($j-1)
	$i = $j - 1;
}
  • Vorschlag 2
  • Vorteil: Nur eine Schleife
  • Nachteil: Aufteilung Gruppenvor-, -durch-, und -nachlauf nicht klar ersichtlich; einiges doppelt; einfach erweiterbar
$schule = $schueler[0]['schule'];
$namenDerSchueler = array();
$namenDerSchueler[] = $schueler[0]['name'];
$anzahlDerSchueler = 1;

for ($i = 1; $i < count($schueler); $i++) {
	if ($schule != $schueler[$i]['schule']) {
		printf('Schule: %s<br>', $schule);
		printf('-- Anzahl Schüler: %s<br>', $anzahlDerSchueler);
		printf('-- Schüler: %s<br>', implode(', ', $namenDerSchueler));
		
		$schule = $schueler[$i]['schule'];
		$namenDerSchueler = array();
		$anzahlDerSchueler = 0;
	}
	
	$namenDerSchueler[] = $schueler[$i]['name'];
	$anzahlDerSchueler++;
}

printf('Schule: %s<br>', $schule);
printf('-- Anzahl Schüler: %s<br>', $anzahlDerSchueler);
printf('-- Schüler: %s<br>', implode(', ', $namenDerSchueler));
  • Vorschlag 3
  • Vorteil: Ohne Probleme erweiterbar
  • Nachteil: Eine Schleife nur für die Ausgabe; sehr schlecht lesbar; nicht allgemeingültig (nicht in allen Programmiersprachen möglich)
$schulenSortiert = array();

for ($i = 0; $i < count($schueler); $i++) {
	if (!array_key_exists($schueler[$i]['schule'], $schulenSortiert)) {
		$schulenSortiert[$schueler[$i]['schule']] = array();
		$schulenSortiert[$schueler[$i]['schule']]['schueler'] = array();
		$schulenSortiert[$schueler[$i]['schule']]['anzahl'] = 0;
	}
	
	$schulenSortiert[$schueler[$i]['schule']]['schueler'][] = $schueler[$i]['name'];
	$schulenSortiert[$schueler[$i]['schule']]['anzahl']++;
}

foreach ($schulenSortiert as $name => $eigenschaft) {
	printf('Schule: %s<br>', $name);
	printf('-- Anzahl Schüler: %s<br>', $eigenschaft['anzahl']);
	printf('-- Schüler: %s<br>', implode(', ', $eigenschaft['schueler']));
}

Ich würde mich wie gesagt über jegliche Anregungen, Meinungen, Kritiken und Vorschläge freuen.

Gruß Dennis