dedlfix: Rekursion, Zähler und mehrdimensionale Arrays

Beitrag lesen

echo $begrüßung;

In einer DB-Tabelle habe ich eine Menge von Behandlungen, die sind untereinander rekursiv über das Feld 'folgebehandlung_zu' verknüpft.

Das rekursive Absetzen von vielen kleinen Querys gegen die Datenbank ist nicht so günstig. Jedes Mal fallen Absetzen der Query, Ausführen der Abfrage, Ergebnis zurückliefern an. Frage lieber alle Daten im Ganzen ab und durchlaufe dann die beispielsweise in einem Array abgelegte Ergebnismenge.

Jetzt möchte ich etwas basteln, das mir am Ende ungefähr folgendes ausgibt:
Behandlungen:
mit 1 Folgebehandlung: 27
mit 2 Folgebehandlungen: 148
mit 3 Folgebehandlungen: 42
...

SELECT behandlung_id FROM ueb_behandlungen WHERE folgebehandlung_zu='$b_id'

Bist du sicher, dass deine Datenhaltung, so wie sie ist, günstig ist? Der Vorgänger der Behandlung Y ist die Behandlung X. Das erscheint mir von hinten aufgezäumt zu sein. Es gibt Behandlung X, die Nachfolgebehandlung dazu ist Y - wäre für mich logischer, einfacher verständlich.

http://forum.de.selfhtml.org/archiv/2005/4/t106720/#m661800 scheint etwas für mich zu sein,

Das ist nur dann "das richtige" wenn du bereits eine Baumstruktur vorliegen hättest. Die Baumstruktur durch viele kleine Datenbankabfragen zu simulieren ist ja wie gesagt ungünstig.

Gegeben sei eine Datenmenge in einem Array ($behandlungen), dessen Keys die Behandlungen (Behandlungs-IDs) sind und dessen Values die dazugehörenden Nachfolgebehandlungen. (Kann man mit einem einfachen Select behandlung, nachfolger from... abfragen)

Für jede Behandlung wollen wir den nachfolgenden Schwanz durchlaufen, der aus aneinandergehängten Nachfolgebehandlungen besteht, bis irgendwann keine mehr kommt (=0). Das Ergebnis zu jeder ID wird zwischengespeichert ($countNachfolger).

$behandlungen wird als Referenz übergeben - global $behandlungen wäre eine (unschöne) Alternative.

function countBehandlungen(&$behandlungen, $id, $count = 0) { // ist nur "braingetestet"
  if ($behandlungen[$id]) // Nachfolger vorhanden?
    return countBehandlungen($behandlungen[$id], ++$count); // Abstieg und zählen
  else
    return $count; // keiner? Ergebnis zurückgeben
}

$countNachfolger = array();
foreach ($behandlungen as $id => $unwichtig)
  $countNachfolger[$id] = countBehandlungen($behandlungen, $id);

array_count_values($countNachfolger) liefert dann die geforderten Summen.

(Eine Optimierung kann man noch einbauen, wenn man sich einmal gezählte Schwänze in einem weiteren Array merkt.)

echo "$verabschiedung $name";