Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   списки (http://forum.oszone.net/showthread.php?t=58586)

slaine 25-12-2005 23:31 386764

списки
 
Crf;bnt как мне вывести эти данные:


CODE
Код:

id nam pid
----------
1  ass  0
2  loop  1
3  zxx  0
4  flip  2

в такую структуру:
вернее, как организовать отступы?

Код:

ass
        loop
                  flip
zxx


vadimiron 26-12-2005 01:02 386776

slaine
я честно говоря не понял, что нужно
Отступы где?? чтобы с отступами выводилась на экран?? или что??

slaine 26-12-2005 03:14 386786

vadimiron ass и zxx разделы, loop и flip - подразделы.
Как мне вывести эти разделы в таком виде:

Код:

ass
        loop
                  flip
zxx


vadimiron 29-12-2005 01:44 387694

slaine
Я тут посидел-подумал-пописал, конечно можно написать проше, но мы же не ищем простых путей :)
Такая структура похожа на смесь деревьев и хеша, поэтому попахивает рекурсивностью
здесь два класса, Node и Hash. Node это отдельные элементы со всеми своими детьми, Hash-это система управления всем этим делом
Node: num-уникальный идентификатор внутри Hash-а, name-имя,children-массив со всеми детками
Hash: table-массив с Node-ами (по сути только с теми, у кого предка нет, все остальные элементы лежат в этих самых элементах, которые находятся на уровне 0(то есть без предка)), counter-счётчик, чтобы определять num для каждого Node

функции:
new_node-для добавления новых Node-ов в Hash, в качестве параметров принимает имя добавляемого и номер его отца, если есть отец
find_node-для поиска Node-а по его имени
show_hash-вроде и так понятно
Вот код:
PHP код:

class Node
{
    
public $name;
    
public $children;
    
public $num;
    function 
__construct($name,$num)
    {
        
$this->name=$name;
        
$this->children=array();
        
$this->num=$num;
    }
    function 
new_child($child_node)
    {
        
$this->children[]=$child_node;
    }
}
class 
Hash
{
    
public $table;
    
private $counter;
    function 
__construct()
    {
        
$this->table=array();
        
$this->counter=-1;
    }
    function 
new_node($name,$parent_num=FALSE)
    {
        
$this->counter++;
        
$new_node=new Node($name,$this->counter);
        if(
$parent_num===FALSE$this->table[]=$new_node;
        else
        {
            
self::set_child($new_node,$parent_num);
        }
    }
    
private function set_child($child,$parent_num,$table=FALSE)
    {
        if(
$table===FALSE$table=$this->table;
        foreach(
$table as $k=>$v)
        {
            if(
$v->num==$parent_num)
            {
                
$table[$k]->new_child($child);
                return 
TRUE;
            }
            if(!empty(
$v->children))
            {
                if(
self::set_child($child,$parent_num,$v->children)) return TRUE;
                else return 
FALSE;
            }
        }
    }
    function 
find_node($name,$table=FALSE)
    {
        if(
$table==FALSE$table=$this->table;
        foreach(
$table as $v)
        {
            if(
$v->name==$name) return $v->num;
            if(!empty(
$v->children))
            {
                
$ret=self::find_node($name,$v->children);
                if(
$ret) return $ret;
                else return 
FALSE;
            }
        }
    }
    function 
show_hash($table=FALSE,$level=-1)
    {
        if(
$table===FALSE$table=$this->table;
        foreach(
$table as $k=>$v)
        {
            
$level++;
            echo 
str_repeat("-",$level).$v->name."<br>";
            if(!empty(
$v->children))
            {
                
self::show_hash($v->children,$level);
            }
            
$level--;
        }
    }


А вот пример применения:
PHP код:

$hash=new Hash();
 
$hash->new_node("ass");
$hash->new_node("loop",$hash->find_node("ass"));
$hash->new_node("flip",$hash->find_node("loop"));
$hash->new_node("zxx");
$hash->new_node("flip2",$hash->find_node("loop"));
$hash->new_node("lalala",$hash->find_node("flip"));
 
$hash->show_hash(); 

Кончено, это не самое лучше решение :), просто мне хотелось поэксперементировать
Код можно усовершенствовать, используя references, но я их не люблю

slaine 19-01-2006 14:57 394651

сенкью vadimiron!
Правда у меня неглубокие познания в классах.
Буду смотреть чо и как.
И ещё сразу хочу спросить что делает ::?

XCodeR 19-01-2006 19:08 394748

:: - указывает область к которой обращаемся....
к примеру PSC::dosmth() - вызывет функцию dosmth из класса PSC
хотя, я могу и ошибаться...


Время: 16:03.

Время: 16:03.
© OSzone.net 2001-