помогите с рекурсией

Статус
В этой теме нельзя размещать новые ответы.
+1 за mentanosa. Imho, его код более читабелен и на другие языки, в случае чего, портируется просто. И причем тут противопоставление рекурсии и статики? В твоем примере рекурсия никуда не девается же тоже.
А я сразу сказал что у меня рекурсия... Я ее и не пытался прятать..)
А на счет того что мой код менее читабелен то я не согласен. Зачем перегружать стек (что компьютера, что программиста) конструкциями которые эмулируют статичесткую переменную, если в языке она есть? лично я если вдруг встречаю оператор или функцию которые я не знал, то я просто открываю справочник, благо интерннет никто не отменял... и мне это не осложняет понимание кода, если функция достаточно прозрачна. Возможность портации както вообще слабовато звучит. :)
P.S. Ну и шутка в тему: чтобы понять рекурсию, надо сначала понять рекурсию. ;)
Вот это поддерживаю... понять рекурсию можно только случайно :) Всегда говорил что рекурсия это зло, и всегда ею пользовался когда было лень писать без нее :)
 
какую н***й рекурсию какую н***й понимать - описанная какими-то там пасанами структура выше - это списки смежности (adjacency list). есть и другие способы хранения иерархичных данных в базе. но коли уж речь зашла о списках смежности - рекурсия с количеством mysql запросов = количеству категорий идёт накуй

часть моего e-shop/app/models/catalogModel.php:
получение всего дерева в ассоциативный масив по своей структуре соответствующий дереву
Код:
    /**
     * Getting full tree from DataBase as associative array
     *
     * @return array associative with tree. Childrens in $arr[$parent_id][$sub_parent_id]['nodes']
     */
    public function getFullTree()
    {
        $this->mysql->Query('SELECT `cats_table`.*,
                                    `types_table`.`name` AS `type_name` 
                             FROM `' . PREFIX . 'categories` AS `cats_table`
                             LEFT JOIN `' . PREFIX . 'categories_types` AS `types_table` ON `cats_table`.`type_id` = `types_table`.`id`
                             ORDER by `pos` ASC');

        if (!$this->mysql->_result) return false;
    
        $nodes = array();
        $keys  = array();
        
        while ($node = $this->mysql->fetchAssoc())
        {
            $nodes[$node['id']] =& $node;
            $keys[] = $node['id'];
            unset($node);
        }
        $this->mysql->FreeResult();
    
        foreach ($keys as $key)
        {
            
            if ($nodes[$key]['parent_id'] === '0') {
                $this->tree[] =& $nodes[$key];
            } else {
                if (isset($nodes[ $nodes[$key]['parent_id'] ])) {
                    if (!isset($nodes[ $nodes[$key]['parent_id'] ]['nodes']))
                        $nodes[ $nodes[$key]['parent_id'] ]['nodes'] = array();

                    $nodes[ $nodes[$key]['parent_id'] ]['nodes'][] =& $nodes[$key];
                }
            }
            
        }
        return $this->tree; 
    }

кроме того постоянно встаёт задача отображения "хлебных крошек" типа: могозинчеггг -> кат намбэ уан -> кат намбэ ту -> селектед кат
в случае adjacency list решаю вопрос self-joining'ом:
(получение пути до вершины)
Код:
    /**
     * Getting full way to vertex by id
     * 
     * @param integer $id ID of vertex to which you wanna get full way
     * @return array ordered by level with all parents categories
     */
    public function getWayToVertex($id = 1)
    {
        if ($id == 0)
            $id = 1;
        $level = $this->mysql->Query('SELECT `level` FROM `' . PREFIX . 'categories` WHERE `id` = ' . $id . ' LIMIT 0, 1')->fetchAssoc();
        $select = 'SELECT `t1`.`name` AS `lev1`, `t1`.`id` AS `id1`, ';
        $from = "FROM `" . PREFIX . "categories` AS `t1` \n";
        $joins  = '';
        for ($i = 2; $i <= $level['level'] + 1; $i++) {
            $select .= "`t$i`.`name` AS `lev$i`, `t$i`.`id` AS `id$i`, ";
            $joins  .= "LEFT JOIN `" . PREFIX . "categories` AS `t" . $i . "` ON `t" . $i . "`.`parent_id` = `t" . ($i - 1) . "`.`id` \n";
        }
        $select = substr($select, 0, -2) . " \n";
        $where = 'WHERE `t1`.`parent_id` = 0 AND `t' . ($level['level'] + 1) . '`.`id` = ' . $id . '';                        
        $sql_query = $select . $from . $joins . $where;
        $result_arr = $this->mysql->Query($sql_query)->fetchAssoc();
        $result_arr = $this->generateNameIDArray($result_arr);
        return $result_arr;
    }

ps. для каталогов у меня используются смежные множества, для комментариев - вложенные (проще дерево строить. оно у меня не перестраивается, просто каменты набравшие Н минусов перестают отображаться).

pps. ащще советую почитать Для просмотра ссылки Войди или Зарегистрируйся
 
Можно и не совсем в тему, но советую прочитать статию - мне уже 2 раза помогала.
Для просмотра ссылки Войди или Зарегистрируйся
 
нужно просто рекурсивной ф-ции добавить параметр массивчек хранящий индекс элементов более высокого уровня:
PHP:
function showtree($id,$idx = array()) {
            global $db, $content;

            $result = $db->query("SELECT * FROM ".MPREF."news_categories WHERE pcategory = ".$id.";");
            $idx_count = count($idx);
            $i=0;
                while ($line = $db->get_row($result)) {
                $cur_idx = $idx + array($idx_count => $i);
                $content .= implode('.',$cur_idx).$line['name']."<br />";
                    showtree($line['id'],$cur_idx);
                    $i++;
                }
            

        }
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху