Hallo miteinander,
versuche seit einigen Tagen eine Funktion zu schreiben, die rekursiv aufgerufen werden kann. Der Zweck ist das erstellen eines Baum Menüs. Ein Eintrag im Menü soll nur angezeigt werden, wenn zum Eintrag mindestens ein Artikel aktiviert ist.
Leider scheitere ich beim Aufruf der zweiten foreach Schleife in der Funktion tep_push_category mit der Fehlermeldung "Invalid argument supplied for foreach()". Die ersten zwei Ebenen kann ich problemlos an das Array anfügen.
Poste hier mal den stark reduzierten Code und das Array so wie es bisher aussieht und wie es aussehen sollte. Die Datenbank Tabellen habe ich aufgrund der Größenbeschränkung im Forum nicht ablegen können.
Beste Grüße und vielen Dank für jeden Hinweis
Leonhard
Das Array so wie es bisher aussieht
Das Array so wie es aussehen sollte mit den Einträgen "ungeschält" und "geschält"
versuche seit einigen Tagen eine Funktion zu schreiben, die rekursiv aufgerufen werden kann. Der Zweck ist das erstellen eines Baum Menüs. Ein Eintrag im Menü soll nur angezeigt werden, wenn zum Eintrag mindestens ein Artikel aktiviert ist.
Leider scheitere ich beim Aufruf der zweiten foreach Schleife in der Funktion tep_push_category mit der Fehlermeldung "Invalid argument supplied for foreach()". Die ersten zwei Ebenen kann ich problemlos an das Array anfügen.
Poste hier mal den stark reduzierten Code und das Array so wie es bisher aussieht und wie es aussehen sollte. Die Datenbank Tabellen habe ich aufgrund der Größenbeschränkung im Forum nicht ablegen können.
Beste Grüße und vielen Dank für jeden Hinweis
Leonhard
PHP-Code:
<?php
//-----------------------------------------------------------------
// Search parent categorie and insert child categorie in menu tree
function tep_push_category( $tree, $categories, $level ) {
$exists = false;
// Check if the parent categories id exists in this level
if( array_key_exists( $categories['parent_id'], $tree ) ) {
// Insert menu entry in the current menu level
$tree[$categories['parent_id']]['sub'][$categories['categories_id']] = array( 'name' => $categories['categories_name'],
'parent' => $categories['parent_id'],
'sub' => array() );
$exists = true;
} else {
// Check if the parent categories id exists in a sub level menu of the current menu level
$level++;
foreach( $tree as $tree_detail ) {
// Check all entries in array named sub
foreach( $tree_detail['sub'] as $tree_sub_detail ) {
// Recursive function request
if( tep_push_category( $tree_sub_detail, $categories, &$level ) ) {
$exists = true;
break 2;
}
}
}
$level--;
}
return $exists;
}
//////////////////////////////////////////////////////////////////
$tree = array();
// Select each level of categories menu
// Insert menu entry only if a product in menu level or sub menu levels is active
$categories_query_raw = "select c.categories_id, cd.categories_name, c.parent_id, " .
"count( p.products_id ) as total " .
"from categories as c " .
"join categories_description as cd " .
"on cd.categories_id = c.categories_id " .
"and cd.language_id = '2' " .
"left join products_to_categories as ptc " .
"on ptc.categories_id = c.categories_id " .
"left join products as p " .
"on p.products_id = ptc.products_id " .
"and p.products_status = '1' " .
"group by c.categories_id " .
"order by c.sort_order, c.parent_id, cd.categories_name";
$categories_query = tep_db_query( $categories_query_raw );
while( $categories = tep_db_fetch_array( $categories_query ) ) {
if( $categories['parent_id'] == '0' ) {
// Collect first level of categories menu
$tree[$categories['categories_id']]= array( 'name' => $categories['categories_name'],
'parent' => $categories['parent_id'],
'sub' => array() );
} else {
// Collect second, third, etc. level of categories menu
tep_push_category( &$tree, $categories, 1 );
}
}
print_r( $tree );
?>
PHP-Code:
Array ( [1] => Array ( [name] => Cerealien [parent] => 0 [sub] => Array ( [2] => Array ( [name] => Flakes [parent] => 1 [sub] => Array ( ) )
[3] => Array ( [name] => Flocken [parent] => 1 [sub] => Array ( ) )
[4] => Array ( [name] => Krunchy [parent] => 1 [sub] => Array ( ) )
[5] => Array ( [name] => Müsli [parent] => 1 [sub] => Array ( ) )
[6] => Array ( [name] => Pops [parent] => 1 [sub] => Array ( ) ) ) )
[7] => Array ( [name] => Getreide [parent] => 0 [sub] => Array ( [8] => Array ( [name] => Dinkel [parent] => 7 [sub] => Array ( ) )
[9] => Array ( [name] => Fünfkorn [parent] => 7 [sub] => Array ( ) )
[10] => Array ( [name] => Gerste [parent] => 7 [sub] => Array ( ) )
[11] => Array ( [name] => Hafer [parent] => 7 [sub] => Array ( ) )
[12] => Array ( [name] => Roggen [parent] => 7 [sub] => Array ( ) )
[13] => Array ( [name] => Weizen [parent] => 7 [sub] => Array ( ) ) ) )
[14] => Array ( [name] => Griess [parent] => 0 [sub] => Array ( [15] => Array ( [name] => Dinkel [parent] => 14 [sub] => Array ( ) ) ) )
[16] => Array ( [name] => Kissenfüllung [parent] => 0 [sub] => Array ( [17] => Array ( [name] => Spelzen [parent] => 16 [sub] => Array ( ) ) ) )
[18] => Array ( [name] => Mehl [parent] => 0 [sub] => Array ( [19] => Array ( [name] => Dinkel [parent] => 18 [sub] => Array ( ) )
[20] => Array ( [name] => Roggen [parent] => 18 [sub] => Array ( ) )
[21] => Array ( [name] => Weizen [parent] => 18 [sub] => Array ( ) ) ) )
[22] => Array ( [name] => Spezialitäten [parent] => 0 [sub] => Array ( [23] => Array ( [name] => Hirse [parent] => 22 [sub] => Array ( ) ) ) ) )
PHP-Code:
Array ( [1] => Array ( [name] => Cerealien [parent] => 0 [sub] => Array ( [2] => Array ( [name] => Flakes [parent] => 1 [sub] => Array ( ) )
[3] => Array ( [name] => Flocken [parent] => 1 [sub] => Array ( ) )
[4] => Array ( [name] => Krunchy [parent] => 1 [sub] => Array ( ) )
[5] => Array ( [name] => Müsli [parent] => 1 [sub] => Array ( ) )
[6] => Array ( [name] => Pops [parent] => 1 [sub] => Array ( ) ) ) )
[7] => Array ( [name] => Getreide [parent] => 0 [sub] => Array ( [8] => Array ( [name] => Dinkel [parent] => 7 [sub] => Array ( ) )
[9] => Array ( [name] => Fünfkorn [parent] => 7 [sub] => Array ( ) )
[10] => Array ( [name] => Gerste [parent] => 7 [sub] => [27] => Array ( [name] => ungeschält [parent] => 10 [sub] => Array ( ) )
[28] => Array ( [name] => geschält [parent] => 10 [sub] => Array ( ) ) )
[11] => Array ( [name] => Hafer [parent] => 7 [sub] => Array ( ) )
[12] => Array ( [name] => Roggen [parent] => 7 [sub] => Array ( ) )
[13] => Array ( [name] => Weizen [parent] => 7 [sub] => Array ( ) ) ) )
[14] => Array ( [name] => Griess [parent] => 0 [sub] => Array ( [15] => Array ( [name] => Dinkel [parent] => 14 [sub] => Array ( ) ) ) )
[16] => Array ( [name] => Kissenfüllung [parent] => 0 [sub] => Array ( [17] => Array ( [name] => Spelzen [parent] => 16 [sub] => Array ( ) ) ) )
[18] => Array ( [name] => Mehl [parent] => 0 [sub] => Array ( [19] => Array ( [name] => Dinkel [parent] => 18 [sub] => Array ( ) )
[20] => Array ( [name] => Roggen [parent] => 18 [sub] => Array ( ) )
[21] => Array ( [name] => Weizen [parent] => 18 [sub] => Array ( ) ) ) )
[22] => Array ( [name] => Spezialitäten [parent] => 0 [sub] => Array ( [23] => Array ( [name] => Hirse [parent] => 22 [sub] => Array ( ) ) ) ) )
Kommentar