phpbar.de logo

Mailinglisten-Archive

[php] problem mit baumdurchlauf-algorithmus

[php] problem mit baumdurchlauf-algorithmus

LB BL lsblsb at gmx.de
Die Mar 8 15:32:25 CET 2005


hallo,

ich weiss auch nicht, ich mach seit stunden rum und griegs einfach net hin. 
zu blöd?

das ist mein problem:
ich hab in einem umfangreicheren zusammenhang einen nested-set tree in einem
array vom prinzip her in dieser form zur verfügung:

$ns_array = array("1-14","2-9","3-4",5-8","6-7","10-13","11-12");

(die array werte sind in meinem fall objekte, von denen ich den linken und
rechten wert (wäre hier z.b. für den ersten knoten links:1,rechts:14) sowie
die vergebene id abfragen kann.)

ich benötige nun einen algorithmus, der mir einen string erzeugt, der dieses
array, bzw. den baum der dahinter steht, in eine form bringt, die nach dem
beispiel array etwa so aussähe:

1-14 2-9 3-4 2-9 5-8 6-7 5-8 2-9 1-14 10-13 11-12 10-13 1-14

man geht also den baum sozusagen durch, indem man zu jedem knoten wandert
und wieder zurück. so speichere ich den baum serialisiert ab.

ich habe auch schon einen algorithmus gehabt. doch der hat einen
mini-denkfehler. problem bei meinem bisherigen ist, dass er beim im baum
hochgehen nicht korrekt arbeitet.

ich hoffe es blickt jemand was ich meine, und hat einen lösungsvorschlag.

so sah mein alg. aus (anderer zusammenhang! diesselbe logik):

function get_subtree_serialized($id = NULL)
	{
		$subtree_serialized = "";
		if(is_null($id))
		{
			$root_node = $this->get_root_node();
			$id = $root_node["id"];
		}
		$subtree_nodes = $this->get_subtree_nodes($id);

		$z_node = 0;
		$depth = 0;
		$leftsteps = 0;
		$passed_nodes = 0;
		$node = $subtree_nodes[0];
		
		for($i=intval($subtree_nodes[0]["lft"]);
$i<intval($subtree_nodes[0]["rgt"]); $i++)
		{
			$node_id_len = strlen($node["id"]);
			$node_id_len_len = strlen($node_id_len);
			$subtree_serialized .= $node_id_len_len . $node_id_len . $node["id"]
."<br>";
		
			if($depth == 0)
			{
				$passed_nodes = $z_node;
			}
			if((intval($node["rgt"])-$i) > 1)
			{//go down
				echo($node['id']." go down<br>");
				$z_node++;
				$depth++;
				$node = $subtree_nodes[$z_node];
			}
			else
			{//go up
				echo($node['id']." go up");
				$depth--;
				if($depth == 0)
				{
					$node = $subtree_nodes[$depth];
				}
				else
				{
					$node = $subtree_nodes[$depth + $passed_nodes];
				}
			}
			
		}
		return $subtree_serialized;
	}



-- 
SMS bei wichtigen e-mails und Ihre Gedanken sind frei ...
Alle Infos zur SMS-Benachrichtigung: http://www.gmx.net/de/go/sms

php::bar PHP Wiki   -   Listenarchive