webForumDet fria alternativet

Flytta objekt i trädstruktur

PHPur PHP

4 svar · 268 visningar · startad av Neo

NeoMedlem sedan dec. 200079 inlägg
#1

Hej!

Jag har en funktion för att visa en trädstruktur av mina objekt i mitt CMS.

Tabellen i db:n har det här fälten:

parcat
catid
linkname
level
user

catid är objektets unika id, parcat är objektets överordnade id (parent) i strukturen, level är vilken nivå i strukturen objektet befinner sig.

"Startsidan" är level=0 och parcat=0

Funktionen ser ut så här:

_____________________________________________

$user_pro = 1;

function DisplayThread($parcat,$user_pro) {

//SQL required to fetch all the pages
$sql = "SELECT * FROM pro_page WHERE parcat";

if ( $parcat == "" ) {
// set parcat to zero if empty
$sql .= "='0'";
} else
$sql .= "=$parcat";

$sql .= " AND user='$user_pro' ORDER BY ordning ASC";

// execute the sql-query
$re_query = mysql_query($sql);
$re_row = mysql_fetch_array($re_query);

$reply = false; // any pages?

if (mysql_num_rows($re_query)>0) {
do {
$db_parcat = $re_row["parcat"];
$db_catid = $re_row["catid"];
$db_linkname = $re_row["linkname"];
$db_level = $re_row["level"];

if ($db_parcat=='0' and $db_level=='0') {
$db_parcat = "-1";
}

// add page to result string
$result .= "<strong>catid:</strong> $db_catid <strong>parcat:</strong> $db_parcat <span style=\"color:#cc0000;\">$db_linkname</span> <strong>level:</strong> $db_level<br />\n";

// recursively fetch subpages
$result .= DisplayThread($db_catid,$user_pro);

} while ($re_row = mysql_fetch_array($re_query));

}

if (mysql_num_rows($re_query)>0) {
// at least one page was processed
return $result;
} else
return "";
}

echo DisplayThread(0,1);

_____________________________________________

Problemet är att om jag vill flytta runt mina objekt i strukturen så funkar det jätte-bra med parcat eftersom jag bara behöver ändra det på det objektet jag flyttar... däremot så blir ju level fel eftersom jag då måste köra en likadan rekursiv funktion på hela strukturen under det objektet som jag flyttar för att ändra level till den level dit jag flyttar objektet.

Jag kan säkert använda den här funktionen till att ändra level också men jag lyckas inte riktigt!

Är det någon som kan hjälpa mig? :-)

Kent.JMedlem sedan aug. 2001153 inlägg
#2

Visserligen inte svar på din fråga... men måste du ha fältet level i databasen ihuvudtaget ?
Kan man väl få fram själv vid rekursiva anrop ..

NeoMedlem sedan dec. 200079 inlägg
#3

Skippa level...

Hej Kent.J!

Jag har också tänkt på att skippa level... anledningen att jag har med det fältet är att slippa köra en query extra för att få ut level utan den ligger ju redan med i första queryn då.

Hur skulle en sån funktion som tar fram nivån i trädstrukturen se ut? Har du något exempel du kan posta så vore jag evigt tacksam!

Jag lyckas inte riktigt klura ut det rekursiva tänkandet. :-(

Kent.JMedlem sedan aug. 2001153 inlägg
#4

Tänk att du har en databas som ser ut enl. följande

+------+--------+---------+
| id   | parent | name    |
+------+--------+---------+
|    1 |      0 | 1       |
|    2 |      0 | 2       |
|    3 |      1 | 1.1     |
|    4 |      1 | 1.2     |
|    5 |      1 | 1.3     |
|    6 |      3 | 1.1.1   |
|    7 |      3 | 1.1.2   |
|    8 |      7 | 1.1.2.1 |
+------+--------+---------+

Där parent=0 är "starten" på trädet

Sedan skriver vi följande:

function display_tree($parent,$level)
   {
	$level++;
	$sql = "select * from pro_page where parent='".$parent."'";
	$result = mysql_query($sql) or die (mysql_error());
	while ($myrow = mysql_fetch_array($result))
		{
		echo "Level: ".$level.", Namn: ".$myrow["name"]."<br>";
		display_tree($myrow["id"],$level);
		}
   }

display_tree(0,0);

Och får då denna utskriften

Level: 1, Namn: 1
Level: 2, Namn: 1.1
Level: 3, Namn: 1.1.1
Level: 3, Namn: 1.1.2
Level: 4, Namn: 1.1.2.1
Level: 2, Namn: 1.2
Level: 2, Namn: 1.3
Level: 1, Namn: 2

Kanske inte det bästa av exempel, men det var vad jag kom på just nu :)

NeoMedlem sedan dec. 200079 inlägg
#5

Tack!

Tack Kent.J!

Det funkar skit-bra! Du har räddat min helg! :-)

142 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)