By passing in simple original data, N types of relationships between nodes can be derived, and a tree-like DOM can be output Note: Please refer to the latest code on git.oschina.net (click the "Source Code Source" link)
/** * Output unlimited classification, I wrote it myself~ * * @author binny_w@qq.com * @since 2013-09-24 AM */ /* Usage example*/ /* $arrAll = array( array('id' => 1, 'name' => 'Column classification_1', 'name_en' => 'cat_1', 'parent_id' => 0),
array('id' => 2, 'name' => 'Column classification_2', 'name_en' => 'cat_2', 'parent_id' => 0),
array('id' => 3, 'name' => 'Column classification_3', 'name_en' => ' cat_3', 'parent_id' => 1),
array('id' => 4, 'name' => 'Column category_4', 'name_en' => 'cat_4', 'parent_id' = > 1),
array('id' => 5, 'name' => 'Column classification_5', 'name_en' => 'cat_5', 'parent_id' => 2),
array ('id' => 6, 'name' => 'Column classification_6', 'name_en' => 'cat_6', 'parent_id' => 4),
array('id' => 7, 'name' => 'Column classification_7', 'name_en' => 'cat_7', 'parent_id' => 6),
array('id' => 8, 'name' => ; 'Column classification_8', 'name_en' => 'cat_8', 'parent_id' => 7),
array('id' => 9, 'name' => 'Column classification_9' , 'name_en' => 'cat_9', 'parent_id' => 6)
);
$objT = new TreeList($arrAll);
print_r($objT->arrAll);
print_r($objT- >arrIdAll);
print_r($objT->arrIdChildren);
print_r($objT->arrIdSon);
print_r($objT->arrIdLeaf);
print_r($objT->arrIdRelation);
print_r($objT->arrIdRelationSimple);
print_r($objT->arrIdRoot);
print_r($objT->arrIdBackPath);
print($objT->getTable());
print($objT ->getSelect('cat', array(1, 8), true));
*/
// !defined('IN_FRAME') && die('404 Page');
class TreeList {
/* *
* Analyze all possible data
*/
public $arrAll = array(); // Original data
public $arrIdRelation = array(); // Multidimensional relationship with _ID as key name
public $arrIdRelationSimple = array(); // Simplification of multi-dimensional relationships based on _ID as key name, used to output tree diagram
public $arrIdAll = array(); // Convert original data into an array with _ID as key name
public $arrIdSon = array() ; // All parent-child relationships
public $arrIdLeaf = array(); // _ID of leaf nodes
public $arrIdRoot = array(); // _ID of root nodes
public $arrIdChildren = array(); // The descendant_ID of each node
public $arrIdBackPath = array(); // Each node goes back to the root
public $strItem = ' {$strSep}{$name}'; / / Output the structure of the tree
/**
*Constructor, pass in original data
*/
public function __construct($arrData) {
$this->arrAll = $arrData;
$this->processData();
}
/ **
* Simple tree
*/
public function getHtml() {
return $this->genHtml();
}
/**
* Use Table to draw trees
*/
public function getTable() {
$this-> strItem = '{$strSep}{$name} {$name} {$name_en} ';
$strRe = '';
$strRe .= '< tr>Structure Chinese name English name ';
$strRe .= $this->genHtml();
$strRe .= '
';
return $strRe;
}
/* *
* Display
in the drop-down box * example:
* $objTreeList->getSelect('parent_id', 0, false, 'class="span5"', array(0, '≡ as a first-level column≡')) )
*/
public function getSelect($strName = 'tree', $arrValue = array(), $blmMulti = false, $strExt = '', $arrFirst = null) {
!is_array($arrValue) && $arrValue = array($arrValue);
foreach ($this->arrIdAll as $strTemp => $arrTemp) {
$this->arrIdAll[$strTemp]['selected'] = '';
if (in_array($arrTemp['id'], $arrValue)) {
$this->arrIdAll[$strTemp]['selected'] = ' selected="selected"';
}
}
$this->strItem = '{$strSep}{$name} ' ;
$strRe = ' $strRe .= ($blmMulti ? ' multiple="multiple"' : '') . (empty($strExt) ? '' : ' ' . $strExt) . '>';
if (is_array($arrFirst) && count($ arrFirst) == 2) {
$strRe .= '' . $arrFirst[1] . ' ';
}
$strRe .= $this->getHtml() . '';
return $strRe;
}
/* ----- The following are private functions for processing data, recursion and loops Like, very complicated! ----- */
private function helpForGetRelation($arrData) {
$arrRe = array();
foreach ($arrData as $strTemp => $arrTemp) {
$arrRe[$ strTemp] = $arrTemp;
if (isset($this->arrIdRelation[$strTemp])) {
$arrRe[$strTemp] = $this->arrIdRelation[$strTemp];
}
if (count( $arrRe[$strTemp]) > 0) {
$arrRe[$strTemp] = $this->helpForGetRelation($arrRe[$strTemp]);
} else {
array_push($this->arrIdLeaf, $ strTemp);
}
}
return $arrRe;
}
private function helpForGetChildren($arrData) {
$arrRe = array_keys($arrData);
foreach ($arrData as $arrTemp) {
$arrRe = array_merge( $arrRe, $this->helpForGetChildren($arrTemp));
}
return $arrRe;
}
private function helpForGetBackPath($str) {
$arrRe = array();
$intTemp = $this-> ;arrIdAll[$str]['parent_id'];
if ($intTemp > 0) {
$intTemp = '_' . $intTemp;
array_push($arrRe, $intTemp);
$arrRe = array_merge($ arrRe, $this->helpForGetBackPath($intTemp));
}
return $arrRe;
}
private function processData() {
foreach ($this->arrAll as $arrTemp) {
$strTemp = ' _' . $arrTemp['id'];
$this->arrIdAll[$strTemp] = $arrTemp;
if ($arrTemp['parent_id'] > 0) {
$strTemp_ = '_' . $ arrTemp['parent_id'];
!isset($this->arrIdRelation[$strTemp_]) && $this->arrIdRelation[$strTemp_] = array();
$this->arrIdRelation[$strTemp_][ $strTemp] = array();
!isset($this->arrIdSon[$strTemp_]) && $this->arrIdSon[$strTemp_] = array();
array_push($this->arrIdSon[$ strTemp_], $strTemp);
} else {
!isset($this->arrIdRelation[$strTemp]) && $this->arrIdRelation[$strTemp] = array();
array_push($this-> arrIdRoot, $strTemp);
}
}
$this->arrIdRelation = $this->helpForGetRelation($this->arrIdRelation);
$this->arrIdLeaf = array_unique($this->arrIdLeaf) ;
foreach ($this->arrIdRelation as $strTemp => $arrTemp) {
$this->arrIdChildren[$strTemp] = $this->helpForGetChildren($arrTemp);
in_array($strTemp, $ this->arrIdRoot) && $this->arrIdRelationSimple[$strTemp] = $arrTemp;
}
$arrTemp = array_keys($this->arrIdAll);
foreach ($arrTemp as $strTemp) {
$this ->arrIdBackPath[$strTemp] = $this->helpForGetBackPath($strTemp);
}
}
private function genSeparator($intLen) {
$strRe = '';
$i = 0;
while ( $i < $intLen) { $strRe .= ' ' . (($i + 1 == $intLen) ? '├' : '│'); $i ++; } !empty($ strRe) && $strRe .= '─'; return $strRe; } private function genHtml($arrRelation = null, $intSep = 0) { $strRe = ''; null === $arrRelation && $arrRelation = $this->arrIdRelationSimple;
foreach ($arrRelation as $strKey => $arrTemp) {
if (count($this->arrIdAll[$strKey]) > 0) {
$strSep = $this->genSeparator($intSep);
extract($this->arrIdAll[$strKey]);
eval('$strRe .= "' . $this->strItem . '";');
count($arrTemp) > 0 && $strRe .= $this->genHtml($arrTemp, ($intSep + 1));
}
}
return $strRe;
}
}
Copy code