---
title: "Flytta objekt i trädstruktur"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/128058-flytta-objekt-i-trädstruktur"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "Neo"
published: "2005-05-12T10:45:05.000Z"
updated: "2005-05-13T14:10:06.000Z"
replies: 4
views: 271
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/128058-flytta-objekt-i-trädstruktur"
---

# Flytta objekt i trädstruktur

## #1 — Neo, 2005-05-12T10:45Z

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? :-)

Permalänk: https://www.webforum.nu/p/128058

## #2 — Kent.J, 2005-05-12T16:21Z

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 ..

Permalänk: https://www.webforum.nu/p/1608741

## #3 — Neo, 2005-05-13T08:46Z

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. :-(

Permalänk: https://www.webforum.nu/p/1608960

## #4 — Kent.J, 2005-05-13T13:32Z

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:

```php
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 :)

Permalänk: https://www.webforum.nu/p/1612127

## #5 — Neo, 2005-05-13T14:10Z

Tack!

Tack Kent.J!

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

Permalänk: https://www.webforum.nu/p/1612138

---

Tråden på webben: https://www.webforum.nu/amne/php/128058-flytta-objekt-i-trädstruktur
