Здравствуйте, есть, к примеру, такая страница HTML: <!doctype html> <head> <meta charset="utf-8"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> <script> $(function(){ $('ul li a').click(function(){ var selected_item = $('ul li a').index(this); var amount_of_menu_items = $('ul li a').size(); var amount_of_sub_menu_items = 0; for(var i = selected_item; i < amount_of_menu_items; i++){ if($('ul li').eq(i).hasClass('sub-item') == false){ break; }else{ amount_of_sub_menu_items++; } } alert(amount_of_sub_menu_items); }); }); </script> </head> <body> <ul> <li><a href="/item-1/" rel="bookmark">item-1</a></li> <li class="sub-item" style="margin-left: 20px;"><a href="/sub-item-1/" rel="bookmark">sub-item-1</a></li> <li class="sub-item" style="margin-left: 20px;"><a href="/sub-item-2/" rel="bookmark">sub-item-2</a></li> <li class="sub-item" style="margin-left: 40px;"><a href="/sub-item-3/" rel="bookmark">sub-item-3</a></li> <li><a href="/item-2/" rel="bookmark">item-2</a></li> <li class="sub-item" style="margin-left: 20px;"><a href="/sub-item-4/" rel="bookmark">sub-item-4</a></li> <li><a href="/item-3/" rel="bookmark">item-3</a></li> </ul> </body> </html> . Нужно выяснить сколько элементов содержит меню с классом sub-item после выбраного пункта и скрыть их, с возможностью бесконечной вложености. Застрял на цикле, прошу помощи.
Что за странная структура меню, и почему ты не используешь вложенные ul, например? Я вообще не вижу никакой вложенности, не говоря уж о бесконечной.
Знаю, что странная, но меню строится с помощью рекурсии, а я хз как вложенность в таком случае показать, поэтому решил через отступ делать, так проще...
ясное дело что с помощью рекурсии. Вопрос не в том через отступ или не через отступ, а в том, почему этот отступ достигается таким неочевидным и неудобным для обработки путем. покажи свою рекурсию
PHP: <?php function list_of_categories () { global $db, $list_of_categories, $list_of_categories_html; $result = $db->query ('SELECT * FROM `' . prefix . '_category` ORDER BY `position`, `category_id`;'); $num_rows = $db->num_rows ($result); $list_of_categories = array (); for ($i = 0; $i < $num_rows; $i++) { $row = $db->fetch_array ($result); $list_of_categories[$i]['category_id'] .= $row['category_id']; $list_of_categories[$i]['alternative_name'] .= $row['alternative_name']; $list_of_categories[$i]['title'] .= $row['title']; $list_of_categories[$i]['parent_category'] .= $row['parent_category']; $list_of_categories[$i]['show'] .= $row['show']; } $list_of_categories_html .= '<ul>' . PHP_EOL; list_of_categories_tree (0, 0); $list_of_categories_html .= '</ul>' . PHP_EOL; return $list_of_categories_html; } function list_of_categories_tree ($parent_category, $level) { global $list_of_categories, $list_of_categories_html; foreach ($list_of_categories as $key => $value) { if ($list_of_categories[$key]['parent_category'] == $parent_category) { if ($level != 0) { $margin_left = 20 * $level; $list_of_categories_html .= '<li class="sub-item" style="margin-left: ' . $margin_left . 'px;"><a href="/' . $list_of_categories[$key]['alternative_name']}/ . '" rel="bookmark">' . $list_of_categories[$key]['title'] . '</a></li>' . PHP_EOL; } else { $list_of_categories_html .= '<li><a href="/' . $list_of_categories[$key]['alternative_name']} . '/" rel="bookmark">' . $list_of_categories[$key]['title'] . '</a></li>' . PHP_EOL; } $level++; list_of_categories_tree ($list_of_categories[$key]['category_id'], $level--); } } } ?>
oh shit! PHP: <? function list_of_categories () { global $db, $list_of_categories, $list_of_categories_html; $result = $db->query ('SELECT * FROM `' . prefix . '_category` ORDER BY `position`, `category_id`;'); $num_rows = $db->num_rows ($result); $list_of_categories = array (); while ($row = mysql_fetch_array($result)){ $list_of_categories[]=$row; } $list_of_categories_html .= list_of_categories_tree($list_of_categories); return $list_of_categories_html; } function list_of_categories_tree ($list_of_categories, $parent_id = null) { $menu_html = '<ul class="' . ($parent_id === null?'top_level':'sub_menu') . '" >'; foreach ($list_of_categories as $row) { if ($row['parent_category'] == $parent_id) { $menu_html .= '<li>'; $menu_html .= '<a href="/' . $row['alternative_name'] . '/" rel="bookmark">' . $row['title'] . '</a>'; $menu_html .= list_of_categories_tree($list_of_categories, $row['category_id']); $menu_html .= '</li>'; } } $menu_html .= "</ul>"; return $menu_html; } Если что-то непонятно - спрашивай.
Немного не понял как массив $list_of_categories заполняется и у меня что-то оно не трудится... Массив выходит вложенный, вида Код (Text): array(1) { [0]=> array(16) { [0]=> string(1) "6" ["category_id"]=> string(1) "6" [1]=> string(1) "0" ["position"]=> string(1) "0" [2]=> string(9) "subalbum3" ["alternative_name"]=> string(9) "subalbum3" [3]=> string(19) "субальбом3" ["title"]=> string(19) "субальбом3" [4]=> string(0) "" ["description"]=> string(0) "" [5]=> string(0) "" ["keywords"]=> string(0) "" [6]=> string(1) "5" ["parent_category"]=> string(1) "5" [7]=> string(3) "yes" ["show"]=> string(3) "yes" } } . У меня такой код PHP: <?php function list_of_categories () { global $db; $result = $db->query ('SELECT * FROM `' . prefix . '_categories` ORDER BY `position`, `category_id`;'); $list_of_categories = array (); while ($row = $db->fetch_array ($result)) { $list_of_categories[] = $row; } $list_of_categories_html = list_of_categories_tree ($list_of_categories); return $list_of_categories_html; } function list_of_categories_tree ($list_of_categories, $parent_category = null) { $list_of_categories_html .= '<ul class="' . ($parent_category === null ? 'top_level' : 'sub_menu') . '">'; foreach ($list_of_categories as $row) { if ($row['parent_category'] == $parent_category) { $list_of_categories_html .= '<li>'; $list_of_categories_html .= '<a href="/' . $row['alternative_name'] . '/" rel="bookmark">' . $row['title'] . '</a>'; $list_of_categories_html .= list_of_categories_tree ($list_of_categories, $row['category_id']); $list_of_categories_html .= '</li>'; } } $list_of_categories_html .= '</ul>'; return $list_of_categories_html; } ?> PHP: <?php var_dump ($parent_category); ?> Код (Text): NULL
Разобрался, вторую функцию нужно было объявлять, как PHP: <?php function list_of_categories_tree ($list_of_categories, $parent_category) { ?> , тогда работает, спасибо за помощь.
Меню сейчас строится, но единственное, что заметил, так это то, что пункт меню имеет вид HTML: <li><a href="/category-2/" rel="bookmark">category-2</a><ul></ul></li> , т.е. пустой список есть еще, на валидность это не влияет, но все же хотелось бы без него...
или каким-то образом проверять наличие детей, или решать в лоб. Поставить PHP: <? $list_of_categories_html = str_replace('<ul></ul>','',$list_of_categories_html); перед return в function list_of_categories