Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Сложный вопрос по рекурсии

Сообщения:  [1-9] 

 
 автор: OLi   (25.07.2011 в 21:21)   письмо автору
 
   для: OLi   (25.07.2011 в 01:45)
 

Кто что подскажет?

  Ответить  
 
 автор: OLi   (25.07.2011 в 01:45)   письмо автору
 
   для: cheops   (21.07.2011 в 16:30)
 

Сложновато все понять...В принципе вот здесь я могу перехватить все id детей
foreach ( $cat_info as $cats) {
                $temp = array();        
            if( $cats['parentid'] == $parentid ){
                           if ($parentid>0){ $temp[]=$root_category;} //ЗДЕСЬ ЗАПИСАВ В МАССИВ
                            $root_category[$cats['id']][] = $cats['icon'];}
        
                       
                }

Только потом как это в рекурсию влить общую?

  Ответить  
 
 автор: cheops   (21.07.2011 в 16:30)   письмо автору
 
   для: OLi   (21.07.2011 в 15:45)
 

Желательно выводить так, чтобы была видна иерархия
<?php
  
echo "<pre>";
  
print_r($cat_info);
  echo 
"</pre>";
?>
Я так понимаю массив линейный, а дерево построено по [parentid]? Тогда вам вероятно луче построить еще один массив, который по ключу текущего каталога будет содержать массив с его потомками - вот к нему и применять count().

  Ответить  
 
 автор: OLi   (21.07.2011 в 15:45)   письмо автору
 
   для: cheops   (21.07.2011 в 15:29)
 

Вывел через print_r($cat_info);

Получил все записи в массиве вида:

Array ( [2] => Array ( [id] => 2 [parentid] => 0 [posi] => 1 [name] => Транспорт и перевозки [alt_name] => transport-i-perevozki [icon] => {THEME}/images/icon/01.gif [skin] => [descr] => Транспорт и перевозки [keywords] =>
 Транспорт и перевозки [news_sort] => title [news_msort] => ASC [news_number] => 0 [short_tpl] => [full_tpl] => [metatitle] => Транспорт и перевозки )...


Может это что-то скажет?

  Ответить  
 
 автор: cheops   (21.07.2011 в 15:29)   письмо автору
 
   для: OLi   (21.07.2011 в 15:10)
 

count() возвращает количество элементов для текущего массива, в случае многомерного массива, он возвращает количество элементов для указанного изменения. Я не заметил у вас SQL-запросов, т.е. вы уже выводите данные по сформированному массиву-дереву? Тогда для каждого узла этого дерева count() должен возвращать разные значения, если count() не подходит - следует написать свою функцию, которая будет выяснять сколько потомков у текущего узла.

  Ответить  
 
 автор: OLi   (21.07.2011 в 15:10)   письмо автору
 
   для: cheops   (21.07.2011 в 15:05)
 

Ну count() всегда больше 0, там не за что зацепиться...или я не так понял.

  Ответить  
 
 автор: cheops   (21.07.2011 в 15:05)   письмо автору
 
   для: OLi   (21.07.2011 в 14:27)
 

Хм.. проверяйте при помощи функции count() есть ли у текущего узла дети - если есть это родитель, для него не нужно выводить флажок, если детей нет, count() вернула 0 - вывести флажок.

  Ответить  
 
 автор: OLi   (21.07.2011 в 14:27)   письмо автору
 
   для: OLi   (21.07.2011 в 14:27)
 

В коде не могу понять где происходит проверка на родительские записи...

  Ответить  
 
 автор: OLi   (21.07.2011 в 14:27)   письмо автору
 
 

Есть рекурсивная функция, которая выводит из базы записи родитель ->дети
function CategoryNewsSelection($categoryid = 0, $parentid = 0, $nocat = TRUE, $sublevelmarker = '', $returnstring = '') {
    global $cat_info, $user_group, $member_id;
    
    $allow_list = explode( ',', $user_group[$member_id['user_group']]['cat_allow_addnews'] );
    $spec_list = explode( ',', $user_group[$member_id['user_group']]['cat_add'] );

    $root_category = array ();
    
    if( $parentid == 0 ) {
        if( $nocat ) $returnstring .= '';
    } else {
        $sublevelmarker .= '  ';
    }
    
    if( count( $cat_info ) ) {
           
        
        foreach ( $cat_info as $cats) {
                   
            if( $cats['parentid'] == $parentid ){ $root_category[$cats['id']][] = $cats['icon'];}
        
                       
                }
        
        if( count( $root_category ) ) {
                    
            foreach ( $root_category as $id=>$icon) {
                       
            
                if( $allow_list[0] == "all" or in_array( $id, $allow_list ) ) {
                    
                    if( ($spec_list[0] == "all" or in_array( $id, $spec_list ))and $id!=="19")
                                           
                                                   
                    
                    $returnstring .= "<input id=\"cat_".$id."\" type=\"checkbox\" onchange=\"onCategoryChange(this.checked)\" value=\"" . $id . '" ';
                                              
                    if( is_array( $categoryid ) ) {
                        foreach ( $categoryid as $element ) {
                            if( $element == $id ) $returnstring .= 'checked';
                        }
                    } elseif( $categoryid == $id ) $returnstring .= 'checked';
                    
                    if ($id!=="19") $returnstring .= '> <img src="'.$icon [0].'"><a href="#" id="link_cat'.$id.'" onclick="show_hide_cat('.$id.');">'.$cat_info[$id]['name'].'</a> <br><div id="div_opisd'.$id.'" class="opis_activity">Введите текст<br><textarea name="catlist[]" id="opisd_'.$id.'"></textarea> <a href="#" onclick="show_hide_cat('.$id.');"><img src="{THEME}/images/close_cat.gif"></a></div>' . $sublevelmarker;
                }
                $returnstring = CategoryNewsSelection( $categoryid, $id, $nocat, $sublevelmarker, $returnstring );
            }
        }
    }
    return $returnstring;
}

Как видно для всех найденных записей формируется input checkbox в том числе и для "детей"
Как мне "словить" рекурсию на выводе только родителей без checkbox, а выводить только для детей?

  Ответить  

Сообщения:  [1-9] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования