Jump to content

Rearrange tree structure


Vel

Recommended Posts

Hey guys, I have a bunch of categories and products in a tree format. For several reasons I need to restructure them from the tree format into a flattened format.

 

I have 2 arrays, one full of categories, the other products. Each category and product has an ID, and a reference to it's parent's ID. The top level categories reference to 0.

 

What I need is to have the categories output like thus:

 

Top Level Categories:

  Category 1

  Category 2

 

Category 1

  Sub category 1

  Sub category 2

 

Category 2

  Sub category 3

  Sub category 4

 

Sub category 1

  Product 1

  Product 2

 

Sub category 2

  Product 3

  Product 4

 

Sub category 3

  Product 5

  Product 6

 

Sub category 4

  Product 7

  Product 8

 

There could be an unlimited number of sub categories within categories before we get to products, so this needs to be done through a function, however I cannot for the life of me think how to do this. Initially I thought about using 2 arrays, a buffer of categories outputted, and a queue of categories to be outputted, but quickly realised that when I go more than 2 layers deep I can't keep track of the queue's properly.

Link to comment
https://forums.phpfreaks.com/topic/261574-rearrange-tree-structure/
Share on other sites

I managed to figure it out in the end. If anyone wants to see how here's the code:

<?php
/* Queue Manager */
function queue_manager($start_cat = 0) {
	$queue = array();
	$num_queue = 0;
	$root = 0;
	for($i = 0; $i < count($this->cats); $i++) {
		if($this->cats[$i]['sectionID'] == $start_cat) {
			$root = $this->cats[$i]['rootSection'];
		}
	}
	if($root) {
		$this->output_product($start_cat);
	} else {
		$add_to_queue = $this->output_cat($start_cat);
		foreach($add_to_queue as $a) {
			$queue[$num_queue++] = $a;
		}
	}
	for($i = 0; $i < $num_queue; $i++) {
		$id = $this->cats[$queue[$i]]['sectionID'];
		$root = $this->cats[$queue[$i]]['rootSection'];
		if($root) {
			$this->output_product($id);
		} else {
			$add_to_queue = $this->output_cat($id);
			foreach($add_to_queue as $a) {
				$queue[$num_queue++] = $a;
			}
		}
	}
}

/* Output Category */
function output_cat($top) {
	echo '<div class="admin-tree-container">' . PHP_EOL;
	$output_buffer = array();
	$return = array();
	for($i = 0; $i < count($this->cats); $i++) {
		if($top == $this->cats[$i]['sectionID']) {
			echo '<div class="admin-tree-container-title">' . $this->cats[$i]['sectionWorkingName'] . '</div>' . PHP_EOL;
		} elseif($top == $this->cats[$i]['topSection']) {
			$return[] = $i;
			$li = '<li id="id' . $this->cats[$i]['sectionID'] . '"><span class="admin-tree-cat';
			if($this->cats[$i]['sectionDisabled']) {
				$li .= ' cat-disabled';
			}
			if($this->cats[$i]['rootSection']) {
				$li .= ' cat-root';
			}
			$li .= '" id="id' . $this->cats[$i]['sectionID'] . '">' . $this->cats[$i]['sectionWorkingName'] . '</span></li>';
			$output_buffer[] = $li;
		}
	}
	echo '<ul>' . PHP_EOL;
	foreach($output_buffer as $o) {
		echo $o . PHP_EOL;
	}
	echo '<li class="sort-button sort-cancel" id="btnid' . $cat . '">+ Add new product</li></ul></div>' . PHP_EOL;
	return $return;
}

/* Output Product */
function output_product($top) {
	echo '<div class="admin-tree-container">' . PHP_EOL;
	for($i = 0; $i < count($this->cats); $i++) {
		if($top == $this->cats[$i]['sectionID']) {
			echo '<div class="admin-tree-container-title">' . $this->cats[$i]['sectionWorkingName'] . '</div>' . PHP_EOL;
			$i = count($this->cats);
		}
	}
	echo '<ul>' . PHP_EOL;
	for($i = 0; $i < count($this->prods); $i++) {
		if($top == $this->prods[$i]['pSection']) {
			echo '<li class="sort-cancel" id="id' . $this->prods[$i]['pID'] . '"><span class="admin-tree-prod';
			if(!$this->prods[$i]['pDisplay']) {
				echo ' prod-disabled';
			}
			if(!$this->prods[$i]['pSell']) {
				echo ' prod-not-sell';
			}
			echo '" id="id' . $this->prods[$i]['pID'] . '">' . $this->prods[$i]['pName'] . '</span></li>' . PHP_EOL;
		}
	}
	echo '<li class="sort-button sort-cancel" id="btnid' . $cat . '">+ Add new product</li></ul></div>' . PHP_EOL;
}

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.