專案中可以經常要生成tree結構, 一般都是從資料庫裡讀父子表,
方式很多種,哪種最好呢? 下面舉個示例:
資料庫:
1--2--表的結構 `oa_group`3--
45create
table
ifnot
exists
`oa_group` (
6 `id` int(11) not
null
auto_increment,
7 `describe` varchar(50) not
null
,8 `auth` varchar(20) default
null
,9 `parent_id` int(11) not
null
default'0
',10primary
key(`id`)
11 ) engine=innodb default charset=utf8 auto_increment=44;
1213
--14
--轉存表中的資料 `oa_group`
15--
1617
insert
into `oa_group` (`id`, `describe`, `auth`, `parent_id`) values
18 (1, '
管理員', '
["all"]
', 0
),19 (2, '
業務經理
', '
["1","3"]
', 0
),20 (3, '
片區主管
', '', 0
),21 (4, '
業務員', '', 3
),22 (5, '
資料檢視
', '', 1
),23 (6, '
錄入員', '', 5
),24 (7, '
碩放片區
', '', 2
),25 (8, '
梅村片區
', '', 3
),26 (12, '
王經理', '', 8
),27 (13, '
老王經理
', '', 2
),28 (42, '
新增組', '', 0
),29 (43, '
新增0組
', '', 42);
方法一:(遞迴)
<?phpfunction getsql($sql
)
mysql_select_db("test",$link
);
mysql_query("set names utf8");
$result = mysql_query($sql
);
$data = array
();
while($row=mysql_fetch_array($result,1))
mysql_close($link
);
return
$data;}
function tojson($pid=0)";
$data = getsql($sql
);
$jsondata = array
();
foreach($data
as$v
)
return
$jsondata;}
print_r
((tojson()));
//print_r(json_encode(array_values(tojson())));
?>
這種方法就是簡單,一看就懂, 但是效率很低,這樣迴圈的讀資料庫tcp開銷太大.
方法二:(迴圈)
1function
tojson2()
9foreach($json_data
as$v)15
}16ksort($json_data
);17
return
$json_data
;18 }
這種方法看起來挺好, 可以要兩次迴圈,能不能優化下呢?
方法三:
1function
tojson3()
9//foreach($json_data as $v)
16//
$json_data[$v['id']] = $v;17}
18ksort($json_data
);19
return
$json_data
;20 }
和方法二比,這優化了很多. 但要注意的兩者之間的區別:
方法二中的sql語句和方法二比少了乙個order by id desc.且parent_id不於id
這很重要,因為方法三中$json_data[$v['parent_id']]['children']時如果沒有排序id..那麼可能這個資料的index還沒有生成.
由此可以看出,方法三的侷限性在於: parent_id必須比id小.當然一般id自動編號的話這是肯定比它小的,
手工指定的parent_id還是方法二比較有效!
使用tree生成專案目錄樹結構
全域性安裝 npm install g treer 使用示例 treer e result.txt i node modules 遍歷到result.txt檔案,忽略node modules 缺陷 格式固定,引數順序前後順序不可隨意調換,不能選擇目錄層級 npm詳細使用文件 全域性安裝 npm in...
php陣列生成樹結構資料返回
array array 1 array id 1,pid 0,name a 2 array id 2,pid 0,name b 3 array id 3,pid 1,name c 4 array id 4,pid 3,name a 5 array id 5,pid 4,name e 1.如果不使用 ...
Oracle 父子樹形結構查詢,行專列 列轉行查詢
本文僅記錄下 之前 所用的一些 oracle 資料庫函式 1.父子屬性結構查詢,例如,父子選單頁等 oracle中start with connect by prior 用來對樹形結構的資料進行查詢。其中start with 給出的是資料搜尋範圍,顧名思義,從 作為查詢的起點,connect by後...