Hello Guys,
I need a little bit of help with recursion. I've searched our PHP website
and Google, but none helped me understand my problem. There is a code below
this message in order to help you understand what I am trying to achieve.
Here is an explaination:
What I'm trying to do is list a typical category/subcategory system with
parents and children associated with those parents. My database table
(categories) lists all the parents and children together, each with a
parent_id field
(with root being a value of 0). What I want to do is, if a user clicked on
one of the parent categories, only one level of that category will show (or
only the direct children of that specific category will show). I want the
depth to be endless because I want to control the depth some other way. I
know that using a recursive theory would cost a lot as far as speed goes,
but I'm willing to risk it for now.
Here is the problem: The problem is that the recursive method yields several
arrays, instead of one long array. I tried to use an array_push() function,
but that doesn't seem to work well with multi-dimentional arrays. I tried
the straight way, i.e. $menu_array[$count]['name'] = $name_of_category or
$menu_array['name'][$count] = $name_of_category, but that yields several
arrays instead of one long array or category names. The depth of the
categories can be determined by the $_GET string passed, $_GET['some_path'],
which is in the format: parent1_child1_grandchild1_grandchild2,
etc.($some_path = 1_4_6_8), where all of these are related to each other.
These, of course, are split using the underscore delimeter: $path['0'] = 1,
$path['1'] = 4, and so on.
And finally, here is my question: How do I get all these categories, parents
and children, listed into one array and then returned. I want to be able to
list them on the web page using one array. I will also include id,
parent_id, and other info with each array, but first I want to get the name
listings of the categories to work. Also, if anyone has any suggestions
about a more speedier way to do this, please let me know.
Sorry for the long explaination, I just wanted to make sure you guys
understood my goals. Thanks in advance to anyone that responds, I appreciate
it very much. Here is the code I promised:
-----------------------------------------
function menu_tree($parent_id = '0', $cPath = '', $menu_array = '') {
if (!is_array($menu_array)) {
$menu_array = array();
$cPath = $this->separatePath($_GET['cPath']); // separates $_GET
string into array of category ids
} else {
reset($cPath);
array_shift($cPath);
}
if (sizeof($cPath) >= 0) {
$db = new base_db();
$query = "select cid, name, parent_id from categories where
parent_id = '" . $parent_id . "' order by sort_order, name;";
$categories = $db->fetch_results($query);
//echo sizeof($cPath)."<br />";
//echo $query."<br />";
for ($i = 0, $count = 0; $i < count($categories); $i++, $count++) {
// The following are the methods I tied, but failed to work
//$menu_array['name'][$count] = $categories[$i]['name'];
//$menu_array[]['name'] = $categories[$i]['name'];
//$menu_array['name'][] = $categories[$i]['name'];
//array_push($menu_array, $categories[$i]['name']); // This one works,
but
does not yeild a multi-dimensional array, which is what I need if I were to
add more information to the output of this array, like id and parent_id
//array_push($menu_array[$count]['name'],
$categories[$i]['name']); // This does not work, gives error saying the
first parameter of array_push must be an array
if (($this->get_children($categories[$i]['cid'])) &&
in_array($categories[$i]['cid'],$cPath)) {
$this->menu_tree($categories[$i]['cid'], $cPath,
$menu_array);
}
}
}
print_r($menu_array);
}
-----------------------------------------
Here is what it returns using the print_r() function on $menu_array
Array ( [name] => Array
(
[0] => Cars
[1] => Honda
[2] => Accord
[3] => 1996
[4] => 1997
[5] => 1998
[6] => 1999
[7] => 2000
[8] => 2001
[9] => 2002
)
)
Array ( [name] => Array
(
[0] => Cars
[1] => Honda
[2] => Accord
[3] => Civic
)
)
Array
(
[name] => Array
(
[0] => Cars
[1] => Honda
[2] => Toyota
)
)
Array
(
[name] => Array
(
[0] => Cars
[1] => Suvs
[2] => Trucks
)
)
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php