傳入簡單的原始資料,可以得出節點間的N種關係,並能輸出樹狀的DOM 注意:請參考git.oschina.net上的最新程式碼(點"源碼出處"連結)
-
/**
- * 輸出無限分類,我自己寫的哦~
- *
- * @author binny_w@qq.com
- * @since 2013-09-24 AM
- */
- /* 使用範例*/
- /*
- $arrAll = array(
- array('id' => 1, 'name' => '欄位分類_1', 'name_en' => 'cat_1', 'parent_id' => 0),
- array('id' => 2 , 'name' => '欄位分類_2', 'name_en' => 'cat_2', 'parent_id' => 0),
- array('id' => 3, 'name' => '欄位分類_3', 'name_en' => 'cat_3', 'parent_id' => 1),
- array('id' => 4, 'name' => '欄位分類_4', 'name_en' => 'cat_4', 'parent_id' => 1),
- array('id' => 5, 'name' => '欄位分類_5', 'name_en' => 'cat_5', 'parent_id' => 2),
- array('id' => 6, 'name' => '欄位分類_6', 'name_en' => 'cat_6', 'parent_id' => 4),
- array(' id' => 7, 'name' => '欄分類_7', 'name_en' => 'cat_7', 'parent_id' => 6),
- array('id' => 8, 'name' => '欄位分類_8', 'name_en' => 'cat_8', 'parent_id' => 7),
- array('id' => 9, 'name' => '欄位分類_9', 'name_en' => 'cat_9', 'parent_id' => 6)
- );
- $objT = new TreeList($arrAll);
- print_r($objT->arrAll);
- print_rr>print_r($objT->arrAll);
- print_rr ($objT->arrIdAll);
- print_r($objT->arrIdChildren);
- print_r($objT->arrIdSon);
- print_r($objT->arrIdLeaf);
- print_$($ 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 {
-
- /**
- * 分析出所有可能用到的資料
- */
- public $arrAll = array(); // 原始資料
- public $arrIdRelation = array(); // 按_ID作鍵名的多維關係
- public $arrIdRelationSimple = array(); // 按_ID作鍵名的多維關係的簡化,用來輸出樹狀圖
- public $arrIdAll = array(); // 將原始資料轉換成的_ID作鍵名的陣列
- public $arrIdSon = array(); // 所有的父子關係
- public $arrIdLeaf = array(); // 葉節點的_ID
- public $arrIdRoot = array(); // 根節點的_ID
- public $arrIdChildren = array(); // 每個節點下的子孫_ID
- public $arrIdBackPath = array(); // 每個節點回逆到根
- public $strItem = '
{$strSep}{$name}'; // 輸出樹的結構
-
- /**
- * 建構子,傳入原始資料
- */
- public function __construct($arrData) {
- $this->arrAll = $arrData;
- $this->processData();
- }
- }
-
- /**
- * 簡單的樹
- */
- public function getHtml() {
- return $this->genHtml();
- }
-
- /**
- * 用Table來畫樹
- */
- public function getTable() {
- $this->strItem = '
{$strSep}{$name} |
{$name} |
{$name_en} |
';
- $strRe = '
';- $strRe .= '
結構 |
中文名 |
英文名 |
';
- $strRe .= $this->genHtml();
- $strRe .= '
';
- return $strRe;
- }
-
- /**
- * 在下拉方塊中顯示
- * example:
- * $objTreeList->getSelect('parent_id', 0, false, 'class="span5"', array(0, '≡ 作為一級欄≡')))
- */
- 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 = '' ;
- $strRe = '';
- return $strRe;
- }
-
- /* -----以下的都是處理資料的私有函數,遞歸和循環之類,很複雜! ----- */
- 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 $arrTempTemp) {
- $arrRe = array_arrge( $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-this> arrIdRelation as $strTemp => $arrTemp) {
- $this->arrIdChildren[$strTemp] = $this->helpForGetChildren($arrTemp);
- in_array($strTemp, $this->arrIdRoot) & $
- in_array($strTemp, $this->arrIdRoot) && $& $& $& $arrIdRelationSimple[$strTemp] = $arrTemp;
- }
- $arrTemp = array_keys($this->arrIdAll);
- foreach ($arrTemp as $strTemp) {
- $this->arrIdBackPath [$strTemp] = $this->helpForGetBackPath($strTemp);
- }
- }
-
- private function genSeparator($intLen) {
- $strRe = '';
- $ while ($i $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) {
- foreach ($arrRelation as $strKey => $arrTemp) {
- foreach ($arrRelation as $strKey => $arrTemp) {
- foreach ($arrRelation as $strKey => $arrTemp) {
- foreach ($arrRelationas $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; }} 複製程式碼
|