Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод дерева, совсем запутался 
V
    Опции темы
gta4kv
Дата 5.5.2008, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Всем добрый вечер! Столкнулся с проблемой вывода дерева.

Получаю дерево таким вот способом:
Код

function get_tree( $parent = 0 ) 
    {
        $res = $this->db->query( "SELECT id,name FROM " . BJ_DB_PREF ."categories  WHERE subid=" . intval( $parent ) . " ORDER BY id" );
        
        if( $this->db->numRows() <= 0 ) return false;
        
        while( $row = $this->db->result() )
        {
            $tmp = $this->get_tree( $row[ 'id' ] );
         if ( count( $tmp ) ) $row[ 'children' ] = $tmp;
         $ret[ $row [ 'id' ] ] = $row;
        }
        return $ret;
    }
 ( если тут что не правильно - ткните пальцом smile )

В итоге получается:
Код

Array
(
    [1] => Array
        (
            [id] => 1
            [name] => Категория 1
            [children] => Array
                (
                    [2] => Array
                        (
                            [id] => 2
                            [name] => Субкатегория 1
                            [children] => Array
                                (
                                    [3] => Array
                                        (
                                            [id] => 3
                                            [name] => Суб-субкатегория 1
                                            [children] => 
                                        )

                                )

                        )

                )

        )

)


Задача собственно его вывести. В любом ввиде.

Заранее благодарен, йа вообщем никак догнать не могу.. ))  smile 
PM MAIL   Вверх
skyboy
Дата 5.5.2008, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(gta4kv @  4.5.2008,  23:08 Найти цитируемый пост)
Задача собственно его вывести. В любом ввиде.

print_r
PM MAIL   Вверх
awers
Дата 5.5.2008, 03:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



вопервых тема на форуме обсуждалась неоднократно..
можешь посмотреть мое решение (мысль до ума не довел, однако работать будет если разберешься)
Код

<?php

/**
 * Класс для работы с древовидными структурами, в основном меню
 * 
 */
class mod_menu{
    /* Массив данных */
    private $menu_array = array();
    /* Темповый массив */
    private $temp_array = array();
    
    public $pm_id;
    public $pm_owner;
    public $pm_items;
    
    public function __construct($id='id',$owner='owner',$items='submenu'){
        $this->pm_id = $id;
        $this->pm_items = $items;
        $this->pm_owner = $owner;
    }
    
    /* Записывает массив элементов */
    public function set($ds){
        $this->menu_array = $ds;
        $this->temp_array = $ds;
    }
    
    /* Восстанавливает массив темп */
    private function restore(){
        $this->temp_array = $this->menu_array;
    }
    
    /* Получить первый элемент меню, относительно текущего элемента */
    public function first($id){
        $result = array();
        foreach ($this->temp_array as $subarr){
            if ($subarr[$this->pm_id]==$id){
                if ($subarr[$this->pm_owner]==0) $result = $subarr; else
                $result = $this->getLastElem($subarr[$this->pm_owner]);
            }
        }
        return $result;        
    }
    
    /* Получить дерево, относительно $id, с уровнем вложенности $maxlvl */
    public function tree($id,$maxlvl = false, $curlvl = 0){
        if ($maxlvl === $curlvl) return ;
        $curlvl++;
        $output = array();
        foreach ($this->temp_array as $key=>$subarray){
            if ($subarray[$this->pm_owner]==$id){
                $result = $subarray;
                $result[$this->pm_items]=$this->tree($subarray[$this->pm_id],$maxlvl,$curlvl);
                $output[] = $result;
            }
        }
        $this->restore();
        return $output;
    }
    
    /* Проверка наличия дочерних элементов */
    public function hasSubmenu($id){
        if (count($this->tree($id,1))==0){
            return false;
        }else{
            return true;
        }
    }
    
    /* Получить элемент по $id */
    public function getElement($id){
        foreach ($this->menu_array as $item){
            if ($item[$this->pm_id] == $id) return $item;
        }
        return false;
    }
}
?>


вобщем смысл в передаче массива
id owner other
1  0         awers
2  1         asda
PM MAIL WWW ICQ Skype   Вверх
gta4kv
Дата 5.5.2008, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



skyboy, не на столько в любом))


awers, спасибо, буду эксперементировать.
PM MAIL   Вверх
Feldmarschall
Дата 5.5.2008, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



awers, насколько я понял, речь идет о выводе, а не о получении отдельных элементов.
То есть, скорее, о шаблоне, который может вывести такое дерево в HTML

gta4kv, получать дерево в таком виде не обязательно - можно в любом другом. 




PM   Вверх
Glip
Дата 9.5.2008, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 7
Всего: 18



awers
Код

    /* Проверка наличия дочерних элементов */
    public function hasSubmenu($id){
        if (count($this->tree($id,1))==0){
            return false;
        }else{
            return true;
        }
    }

укорачиваем
Код

    /* Проверка наличия дочерних элементов */
    public function hasSubmenu($id){
        return (count($this->tree($id,1))!=0)
    }

это так с ходу, или '>' вместо '!=' по логике


--------------------
user posted image
PM MAIL   Вверх
gta4kv
Дата 12.5.2008, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Вывел рекурсивно.

Код

    public function getCategory( $id = 0 )
    {
        if( $id > 0 )
        {
            $queryString = sprintf( "select * from " . BJ_DB_PREF . "categories" . 
                                    "where id ='%d'",
                                    $this->db->escape( $id ) );
        }
        else 
        {
            $queryString = "select * from " . BJ_DB_PREF . "categories";
        }
        
        $query = $this->db->query( $queryString );
        
        if( $this->db->numRows( $query ) <= 0 )
        {
            $this->setError( BJ_LNG_CAT_nocats );
            return false;
        }
        
        while( $row = $this->db->result( $query ) )
        {
            $tree[ $row [ ParentID ] ] [ $row[ ID ] ] = $row[ Title ];
        }
        
        return $tree;
        
    }
    
    function ShowTree( $tree, $pid = 0 )
    {
        echo "<ul type=square>";
        foreach( $tree as $id => $root )
        {
            if( $pid != $id ) 
            {
                continue;
            }
            
            if( count( $root ) )
            {
                foreach( $root as $key => $title )
                {
                    echo "<li>{$title}";
                    if( count( $tree[$key] ) )
                    {
                        $this->ShowTree( $tree , $key );
                    }
                        
                }
            }
        }
        echo "</ul>";
    }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1115 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.