Ich bin mal nett, hatte gerade das Bedürfnis, ein wenig an deinem Code rumzubasteln. Musste allerdings die Datenbankabfrage gegen ein Array austauschen zum Testen. Würde dir eh raten, lieber die Datenbank einmal auszulesen, in einem Array abzuspeichern, und damit zu arbeiten. Spart Abfragen an die Datenbank.
Mein Code sieht jetzt so aus:
Code: Alles auswählen
<?php
$id = 1;
$generationen = 12;
$personen = array(
1 => array('name' => 'Person 1', 'vater_id' => 2, 'mutter_id' => 3),
2 => array('name' => 'Vater 1', 'vater_id' => 4, 'mutter_id' => 5),
3 => array('name' => 'Mutter 1', 'vater_id' => 6, 'mutter_id' => 7),
4 => array('name' => 'Vater 2', 'vater_id' => 8, 'mutter_id' => 9),
5 => array('name' => 'Mutter 2', 'vater_id' => 10, 'mutter_id' => 11),
//6 => array('name' => 'Vater 2.2', 'vater_id' => 11, 'mutter_id' => 12),
//7 => array('name' => 'Mutter 2.2', 'vater_id' => 12, 'mutter_id' => 13),
);
//Vorfahren funktion
function ahnen($id, $generation, $is_vater)
{
global $generationen, $personen;
if($generation < $generationen)
{
$generation++;
if(!isset($personen[$id]))
return 0;
//$sql = "SELECT * FROM personen WHERE id = '$id'";
//$result = mysql_query($sql);
//$person=mysql_fetch_array($result);
$person = $personen[$id];
$vater = $person['vater_id'];
$mutter = $person['mutter_id'];
{
$level = ahnen($vater,$generation,true);
ahnen($mutter,$generation,false);
}
if($is_vater)
echo str_repeat('      ',$level)."$person[name]";
else
echo ' + ' . "$person[name]<br>";
}
return $level + 1;
}
ahnen($id,0,true);
?>
Ausgabe ist:
Das Problem, was sich jetzt stellt, ist, wenn du den Stammbaum nicht nur in eine Richtung haben möchtest. Also wenn er etwa so aufgebaut sein soll:
Code: Alles auswählen
Vater 2 + Mutter 2 Vater 2.2 + Mutter 2.2
Vater 1 + Mutter 1
Person 1
Kannst du bei meinem Code testen, indem du oben die beiden weiteren Array-Zeilen einkommentierst.
Das Problem hierbei ist einfach, dass du dann nicht sofort ausgeben darfst. Du musst gucken, wie viele parallel-Generationen existieren, und sie in eine Zeile zusammenbasteln, dann ausgeben.
Beste Lösung hier wäre wohl ein Array anzulegen über die Generationen und in denen die Leute in einem Array pro Generation einspeichern, statt sofort auszugeben. Allerdings besteht dann das Problem mit der Formatierung, die dann schwieriger wird, und was passiert, wenn ein Elternteil beispielweise keine Großeltern angegeben hat, eines aber schon.
Hoff aber die Grundidee ist klar?