Jump to content

[SOLVED] Sub-Category system using 2-D arrays


Goldeneye

Recommended Posts

I have a categorization-class which works perfectly as it is. I've decided to modify this class to support sub-categories. Here's how I'm trying to do it:

<?php
$_foo = array('Parent 1' => array('Child 1-1', 'Child 1-2', 'Child 1-3', 'Child 1-4'),
		'Parent 2' => array('Child 2-1', 'Child 2-2', 'Child 2-3')
		);
foreach($_foo as $key => $val){
	$offset += 0;
	$categories = $category->generate($val, $offset);
	$num = array_keys($val);
	$offset = count($val);
	$mainb .= '<b>'.$key.'</b>';
	$mainb .= '<ul style="margin-left: 2em;">';
	for($i = 1; $i < $offset; ++$i)
		$mainb .= '<li><a href="categories.php?category='.$num[$i].'">'.$category->names($val, $num[$i]).'</a></li>';
	$mainb .= '</ul>';
	}
?>

$offset is the number of elements of the current array to be used in the next pass through the loop for the $category->generate() function.

 

Basically how it works is if $offset does not equal zero, it will use that value as the starting point for generating the numerated array-keys for each value in the array.

 

Example 1: $offset = 0; $array = array('element 1', 'element 2', element 3');

The arrray from $category->generate($array, $offset) would then be: $array = array(1 => 'element 1', 2 => 'element 2', 4 => 'element 3');

 

Example 2: $offset = 3; $array = array('element 1', 'element 2', element 3');

The arrray from $category->generate($array, $offset) would then be: $array = array(8 => 'element 1', 16 => 'element 2', 32 => 'element 3');

 

Here are the functions I use in my Categorization-class:

<?php
class category {
	// $category::generate() takes an array of values and assigns each value a base-2 key.
	// IF $offset does NOT 0 (zero), the Array-Key will start off from that value (not 0)
	function generate($array, $offset = 0){
		$n = count($array);
		$c = array();
		for($i = 0; $i < $n; ++$i){
			$x = $offset == 0 ? $i : $offset;
			$c[abs(pow(2, $x))] = $array[$i];
			//if($offset != 0)
				++$x;
		}
		return $c;
	}
	// category::names() takes the $array and retrieves the name corresponding the array-key given (as $num)
	function names($array, $num){
		if($num==0) return 'None';
		$category = $this->generate($array);
		foreach($category as $key => $val)
			if($num & $key) $names[] = $val;
		if(count($names) > 1) return implode(', ', $names);
		return $names[0];
	}
}
?>

 

Basically what I want to do is loop through the two-dimensional array assign values to each of the values in the remaining arrays.

 

This is what I want to achieve

Parent 1: Array ( [1] => Child 1-1 [2] => Child 1-2 [4] => Child 1-3 [8] => Child 1-4 )

Parent 2: Array ( [16] => Child 2-1 [32] => Child 2-2 [64] => Child 2-3 )

 

But this is what I get instead

Parent 1: Array ( [1] => Child 1-1 [2] => Child 1-2 [4] => Child 1-3 [8] => Child 1-4 )

Parent 2: Array ( [16] => Child 2-3 )

 

If anyone has any idea what exactly is going wrong here (or can suggest a better/simpler way) please share because this is getting to be a real obstacle for me right now.

 

Hopefully this is clear enough. If it isn't I will do my best to try to clarify anything that might be unclear.

 

A preemptive thanks!

 

EDIT: Oh, and the browser-output I'm getting is:

<h2>Parent 1</h2>
      <link>Child 1-1</link>
      <link>Child 1-2</link>
      <link>Child 1-1, Child 1-2</link>
<h2>Parent 2</h2>
      <link>Child 2-1</link>
      <link>Child 2-2</link>

 

Instead of:

<h2>Parent 1</h2>
      <link>Child 1-1</link>
      <link>Child 1-2</link>
      <link>Child 1-3</link>
<h2>Parent 2</h2>
      <link>Child 2-1</link>
      <link>Child 2-2</link>
      <link>Child 2-3</link>

Link to comment
Share on other sites

<?php
$_foo = array('Parent 1' => array('Child 1-1', 'Child 1-2', 'Child 1-3',
    'Child 1-4'), 'Parent 2' => array('Child 2-1', 'Child 2-2', 'Child 2-3'));
    
foreach($_foo AS $key => $val){
echo "<h2>".$key."</h2>";
foreach($val AS $meow){
	echo "<link>".$meow."</link><br>\n";
}
}
?>

 

I get:

 

Parent 1

Child 1-1

Child 1-2

Child 1-3

Child 1-4

 

Parent 2

Child 2-1

Child 2-2

Child 2-3

 

Link to comment
Share on other sites

<?php
$_foo = array('Parent 1' => array('Child 1-1', 'Child 1-2', 'Child 1-3',
    'Child 1-4'), 'Parent 2' => array('Child 2-1', 'Child 2-2', 'Child 2-3'));
    
foreach($_foo AS $key => $val){
echo "<h2>".$key."</h2>";
foreach($val AS $meow){
	echo "<link>".$meow."</link><br>\n";
}
}
?>

 

I get:

 

Parent 1

Child 1-1

Child 1-2

Child 1-3

Child 1-4

 

Parent 2

Child 2-1

Child 2-2

Child 2-3

 

 

That actually helped narrow down the problem. It didn't solve my problem but I at least know the problem (most likely) resides with that offset variable I use in $category->generate(). So thank you very much!

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

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