Problem mit Rekursion

splat

Erfahrenes Mitglied
Hi,

ich habe hier folgende Tabelle in meiner MySQL Datenbank:
Code:
id | type   | name               | country
-------------------------------------------------
1 | state   | Bayern             | Deutschland
2 | state   | Hessen             | Deutschland
3 | country | Deutschland        | NULL
4 | state   | Queensland         | Australien
5 | state   | Victoria           | Australien 
6 | state   | Northern Territory | Australien 
7 | country | Australien         | NULL

Ich würde die Zuordnungen ja auch viel lieber über parent id's lösen, aber ich kann die Datenbank leider nicht modifizieren. Naja, jedenfalls brauche ich ein Select Feld, bei dem ich alle Länder, sowie Regionen sehen kann. Wenn es geht, sollten die Regionen etwas eingerückt sein. Das sollte ja mit dieser Struktur auch irgendwie zu machen sein, nur bekomme ich das ganze nicht so hin.

Mit diesem Code sollte das von der Logik her soweit 'eigentlich' funktionieren:
PHP:
function build_location_tree(&$output, $parent="", $indent="") {
	$qid = mysql_query("SELECT country, id, name FROM location WHERE country = '$parent' ORDER by name ASC");

	while ($loc =  mysql_fetch_object($qid)) {
		$output .= "<option value=\"" . ov($loc->id) . "\" >$indent" . ov($loc->name);
		if ($loc->country != $parent) {
			build_location_tree($output, $loc->name, $indent."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
		}
	}
}

Nur wie kann ich die Länder mit dem Eintrag 'NULL' als übergeordnetes Land bestimmen? Mit $parent="" in der ersten Zeile bekomme ich nämlich überhaupt kein Land ausgegeben. Hat jemand eine Idee?

Marc
 
Ich seh zwar noch nicht ganz durch bei deiner Funktion aber vllt hilt dir ja das:

PHP:
if ($loc->country == NULL)
Glaube zu wissen das man sowas machen kann, denn $parent wäre ein Leerstring der nicht in deiner DB zu finden ist.

mfg
 
Wenn ich ganz zu Beginn $parent = "Australien" definiere, dann gibt er mir ja alle Regionen des Landes Australien aus. Das funktioniert soweit schon alles.. Nur soll er eben mit den Ländern beginnen.. aber wenn ich "NULL" als $parent für den Anfang angebe, dann findet er leider nichts.
Gibt es dafür keine andere Lösung? :(
 
Hat denn wirklich niemand einen Tip, wie man so etwas lösen könnte?
Wenn man separate Tabellen für die Länder und Regionen hätte, dann könnte man das über eine dritte Tabelle mit den Zuordnungen lösen.. das wäre ja kein Problem. Ich weiß ja auch, dass das Tabellenlayout häßlich ist, aber so es muss doch auch irgendwie funktionieren. :(

Im Anhang habe ich mal ein Bildchen von der Selectbox, wie sie dann aussehen sollte... Falls dem ein oder anderen noch unklar sein sollte, was ich genau vorhabe.

Gruß,
Marc
 

Anhänge

  • 1attachment.jpg
    1attachment.jpg
    7,6 KB · Aufrufe: 16
Habe es inzwischen hinbekommen... schwere Geburt.. :)

Aufruf der Funktion:
NULL für alle Länder. Will man nur die Regionen eines Landes, dann trägt man das jeweilige Land ein.
PHP:
build_location_tree($location_options, "NULL");

Funktion:
PHP:
function build_location_tree(&$output, $parent, $indent="") {

	if ($parent == "NULL") { 
          $sql = "IS NULL"; 
        } else { 
          $sql = "= '$parent'"; 
        }
	$qid = db_query("SELECT country, id, name FROM location WHERE country $sql ORDER by name ASC");

	while ($loc =  db_fetch_object($qid)) {
		$output .= "<option value=\"" . ov($loc->id) . "\" >$indent" . ov($loc->name);
		if ($loc->country != '$parent') {
			build_location_tree($output, $loc->name, $indent."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
		}
	}
}

Dropdown Menu:
PHP:
<select name="location">
<?php echo $location_options; ?>
</select>

Alles schön sortiert und die Regionen sind nach dem Land schön eingerückt. :D
Bis zum nächsten mal!
 
Nicht schlecht kann man bestimmt mal gebrauchen, habe mich immer gefragt wie man sowas hinbekommt mit Einrückung :-)

Bitte noch den Thread als "Erledigt" markieren(!) Danke :)
 
Zurück