<?
/* *
* @author YangHuan
* @datetime
* @version 1.0.0
*/
/* *
* Short description.
*
* Detail description
* @author
* @version 1.0
* @copyright
* @access public
*/
class Tree
{
/* *
* Description
* @var
* @since 1.0
* @access private
*/
var $data = array ();
/* *
* Description
* @var
* @since 1.0
* @access private
*/
var $child = array ( - 1 => array ());
/* *
* Description
* @var
* @since 1.0
* @access private
*/
var $layer = array ( - 1 =>- 1 );
/* *
* Description
* @var
* @since 1.0
* @access private
*/
var $parent = array ();
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function Tree ( $value )
{
$this -> setNode( 0 , - 1 , $value );
} // end func
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function setNode ( $id , $parent , $value )
{
$parent = $parent ? $parent : 0 ;
$this -> data[ $id ] = $value ;
$this -> child[ $id ] = array ();
$this -> child[ $parent ][] = $id ;
$this -> parent[ $id ] = $parent ;
if ( ! isset ( $this -> layer[ $parent ]))
{
$this -> layer[ $id ] = 0 ;
}
else
{
$this -> layer[ $id ] = $this -> layer[ $parent ] + 1 ;
}
} // end func
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function getList ( & $tree , $root = 0 )
{
foreach ( $this -> child[ $root ] as $key => $id )
{
$tree [] = $id ;
if ( $this -> child[ $id ]) $this -> getList( $tree , $id );
}
} // end func
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function getValue ( $id )
{
return $this -> data[ $id ];
} // end func
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function getLayer ( $id , $space = false )
{
return $space ? str_repeat ( $space , $this -> layer[ $id ]) : $this -> layer[ $id ];
} // end func
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function getParent ( $id )
{
return $this -> parent[ $id ];
} // end func
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function getParents ( $id )
{
while ( $this -> parent[ $id ] != - 1 )
{
$id = $parent [ $this -> layer[ $id ]] = $this -> parent[ $id ];
}
ksort ( $parent );
reset ( $parent );
return $parent ;
} // end func
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function getChild ( $id )
{
return $this -> child[ $id ];
} // end func
function unsetTree(){
$this -> data = array ();
$this -> child = array ( - 1 => array ());
$this -> layer = array ( - 1 =>- 1 );
$this -> parent = array ();
}
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function getChilds ( $id = 0 )
{
$child = array ( $id );
$this -> getList( $child , $id );
return $child ;
} // end func
} // end class
/*
//new Tree(根目录的名字);
//根目录的ID自动分配为0
$Tree = new Tree('根目录');
//setNode(目录ID,上级ID,目录名字);
$Tree->setNode(1, 0, '目录1');
$Tree->setNode(2, 0, '目录2');
$Tree->setNode(3, 0, '目录3');
$Tree->setNode(4, 3, '目录3.1');
$Tree->setNode(5, 3, '目录3.2');
$Tree->setNode(6, 3, '目录3.3');
$Tree->setNode(7, 2, '目录2.1');
$Tree->setNode(8, 2, '目录2.2');
$Tree->setNode(9, 2, '目录2.3');
$Tree->setNode(10, 6, '目录3.3.1');
$Tree->setNode(11, 6, '目录3.3.2');
$Tree->setNode(12, 6, '目录3.3.3');
//getChilds(指定目录ID);
//取得指定目录下级目录.如果没有指定目录就由根目录开始
$category = $Tree->getChilds(2);
//遍历输出
foreach ($category as $key=>$id)
{
echo $Tree->getLayer($id, '|-').$Tree->getValue($id)."<br>\n";
}
*/
?>
/* *
* @author YangHuan
* @datetime
* @version 1.0.0
*/
/* *
* Short description.
*
* Detail description
* @author
* @version 1.0
* @copyright
* @access public
*/
class Tree
{
/* *
* Description
* @var
* @since 1.0
* @access private
*/
var $data = array ();
/* *
* Description
* @var
* @since 1.0
* @access private
*/
var $child = array ( - 1 => array ());
/* *
* Description
* @var
* @since 1.0
* @access private
*/
var $layer = array ( - 1 =>- 1 );
/* *
* Description
* @var
* @since 1.0
* @access private
*/
var $parent = array ();
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function Tree ( $value )
{
$this -> setNode( 0 , - 1 , $value );
} // end func
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function setNode ( $id , $parent , $value )
{
$parent = $parent ? $parent : 0 ;
$this -> data[ $id ] = $value ;
$this -> child[ $id ] = array ();
$this -> child[ $parent ][] = $id ;
$this -> parent[ $id ] = $parent ;
if ( ! isset ( $this -> layer[ $parent ]))
{
$this -> layer[ $id ] = 0 ;
}
else
{
$this -> layer[ $id ] = $this -> layer[ $parent ] + 1 ;
}
} // end func
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function getList ( & $tree , $root = 0 )
{
foreach ( $this -> child[ $root ] as $key => $id )
{
$tree [] = $id ;
if ( $this -> child[ $id ]) $this -> getList( $tree , $id );
}
} // end func
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function getValue ( $id )
{
return $this -> data[ $id ];
} // end func
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function getLayer ( $id , $space = false )
{
return $space ? str_repeat ( $space , $this -> layer[ $id ]) : $this -> layer[ $id ];
} // end func
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function getParent ( $id )
{
return $this -> parent[ $id ];
} // end func
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function getParents ( $id )
{
while ( $this -> parent[ $id ] != - 1 )
{
$id = $parent [ $this -> layer[ $id ]] = $this -> parent[ $id ];
}
ksort ( $parent );
reset ( $parent );
return $parent ;
} // end func
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function getChild ( $id )
{
return $this -> child[ $id ];
} // end func
function unsetTree(){
$this -> data = array ();
$this -> child = array ( - 1 => array ());
$this -> layer = array ( - 1 =>- 1 );
$this -> parent = array ();
}
/* *
* Short description.
*
* Detail description
* @param none
* @global none
* @since 1.0
* @access private
* @return void
* @update date time
*/
function getChilds ( $id = 0 )
{
$child = array ( $id );
$this -> getList( $child , $id );
return $child ;
} // end func
} // end class
/*
//new Tree(根目录的名字);
//根目录的ID自动分配为0
$Tree = new Tree('根目录');
//setNode(目录ID,上级ID,目录名字);
$Tree->setNode(1, 0, '目录1');
$Tree->setNode(2, 0, '目录2');
$Tree->setNode(3, 0, '目录3');
$Tree->setNode(4, 3, '目录3.1');
$Tree->setNode(5, 3, '目录3.2');
$Tree->setNode(6, 3, '目录3.3');
$Tree->setNode(7, 2, '目录2.1');
$Tree->setNode(8, 2, '目录2.2');
$Tree->setNode(9, 2, '目录2.3');
$Tree->setNode(10, 6, '目录3.3.1');
$Tree->setNode(11, 6, '目录3.3.2');
$Tree->setNode(12, 6, '目录3.3.3');
//getChilds(指定目录ID);
//取得指定目录下级目录.如果没有指定目录就由根目录开始
$category = $Tree->getChilds(2);
//遍历输出
foreach ($category as $key=>$id)
{
echo $Tree->getLayer($id, '|-').$Tree->getValue($id)."<br>\n";
}
*/
?>