A. java中的無限級分類
其實跟樹一樣。無限級數。以我的經驗 肯定是 比如 中國 下面在分 重慶、北京、成都等、 然後在分 重慶市、萬州區。以一種樹形的結構展現
用xtree控制項或者extree。網上搜一下。很多DEMO
B. 關於php無限極分類
functiongenTree5($items){
foreach($itemsas$item)
$items[$item['pid']]['son'][$item['id']]=&$items[$item['id']];
returnisset($items[0]['son'])?$items[0]['son']:array();
}
超級爽的函數,格式可能不一樣,但肯定有用,樹狀結構的輸出
C. php無限極分類除了遞歸還有什麼方法
給個函數你,調用get_category()就是一個數組格式的結果
function get_category($parent_id=0){
$arr=array();
$sql = "select * from category where parent_id=$parent_id";//查詢子級數據
$result = array(a_object,b_object,,,)=sql_query($sql);//查詢結果一個數組或列表格式,自己完善。
if($result){
foreach($result as $re){//循環數組
if(get_category($re.id))//如果子級不為空
$re['child'] = get_category($re.id);
$arr[] = $re;
}
return $arr;
}
D. php 幾種常用的遞歸 無限極分類
/**
*遞歸實現無限極分類
*@param$array分類數據
*@param$pid父ID
*@param$level分類級別
*@return$list分好類的數組直接遍歷即可$level可以用來遍歷縮進
*/
functiongetTree($array,$pid=0,$level=0){
//聲明靜態數組,避免遞歸調用時,多次聲明導致數組覆蓋
static$list=[];foreach($arrayas$key=>$value){//第一次遍歷,找到父節點為根節點的節點也就是pid=0的節點
if($value['pid']==$pid){//父節點為根節點的節點,級別為0,也就是第一級
$value['level']=$level;//把數組放到list中
$list[]=$value;//把這個節點從數組中移除,減少後續遞歸消耗
unset($array[$key]);//開始遞歸,查找父ID為該節點ID的節點,級別則為原級別+1
getTree($array,$value['id'],$level+1);
}
}
E. thinkphp無限極分類能分頁顯示嗎
TreeTable是一個能把無限分類展現為表格形式的PHP類庫插件,分類的層級表示為表格的列,分類的行數表格分類的總數。單元格顯示分類名稱。
TreeTable通過對單元格的行合並和列合並實現了無限層級也能較好的展示層級架構。
1.構建ID/PID/NAME的數組,後期可通過資料庫生成的動態數據。
Tree演算法請打開鏈接:http://www.oschina.net/code/snippet_99943_1452
array(
* 1 => array('id'=>'1','parentid'=>0,'name'=>'一級欄目一'),
* 2 => array('id'=>'2','parentid'=>0,'name'=>'一級欄目二'),
* 3 => array('id'=>'3','parentid'=>1,'name'=>'二級欄目一'),
* 4 => array('id'=>'4','parentid'=>1,'name'=>'二級欄目二'),
* 5 => array('id'=>'5','parentid'=>2,'name'=>'二級欄目三'),
* 6 => array('id'=>'6','parentid'=>3,'name'=>'三級欄目一'),
* 7 => array('id'=>'7','parentid'=>3,'name'=>'三級欄目二')
* )
2. 導入TreeTable類庫。
import('@.ORG.Util.TableTree'); //Thinkphp導入方法
3. 生成TreeTable HTML代碼
$treeTable->init($treearr);
echo $treeTable->get_treetable();
注意:get_treetable()只生產表體部門,<TALBE></TABLE>請自行構建。
完整代碼
<?php
/**
* File name: TreeTable.class.php
* Author: run.gao [email protected] Date: 2012-07-24 23:22 GMT+8
* Description: 通用的表格無限級分類
* */
/**
* 表格展示無限分類是將無線分類已表格的形式表現出來,更好的能體現出分類的所屬關系
* 使用方法:
* 1. 實例化分類
* $treeTable = new TreeTable();
* 2. 初始化分類,$treearr必須是一個多維數組且包含 id,parentid,name欄位
* $treeTable->init($treearr);
* 3. 獲取無限分類HTML代碼
* echo $treeTable->get_treetable();
* */
class TreeTable {
/**
* 生成樹型結構所需要的2維數組
* @var array
*/
public $arr = array();
/**
* 表格列數
* @var int
*/
public $columns = 0;
/**
* 表格行數
* @var int
*/
public $rows = 0;
/**
* 初始化TreeTable數據
* @param array 2維數組
* array(
* 1 => array('id'=>'1','parentid'=>0,'name'=>'一級欄目一'),
* 2 => array('id'=>'2','parentid'=>0,'name'=>'一級欄目二'),
* 3 => array('id'=>'3','parentid'=>1,'name'=>'二級欄目一'),
* 4 => array('id'=>'4','parentid'=>1,'name'=>'二級欄目二'),
* 5 => array('id'=>'5','parentid'=>2,'name'=>'二級欄目三'),
* 6 => array('id'=>'6','parentid'=>3,'name'=>'三級欄目一'),
* 7 => array('id'=>'7','parentid'=>3,'name'=>'三級欄目二')
* )
*/
public function init($arr=array()){
if(!is_array($arr)) return false;
foreach ($arr as $k=>$v) {
$this->arr[$v['id']] = $v;
}
foreach ($this->arr as $k => $v){
$this->arr[$k]['column'] = $this->get_level($v['id']); // Y軸位置
$this->arr[$k]['arrchildid'] = $this->get_arrchildid($v['id']); // 所有子節點
$this->arr[$k]['arrparentid'] = $this->get_arrparentid($v['id']); // 所有父節點
$this->arr[$k]['child_bottom_num'] = $this->get_child_count($v['id']); // 所有底層元素節點
}
$this->columns = $this->get_columns(); // 總行數
$this->rows = $this->get_rows(); // 總列數
// 按照arrparentid和id號進行排序
$this->sort_arr();
foreach ($this->arr as $k => $v){
$this->arr[$k]['row'] = $this->get_row_location($v['id']); // X軸位置
$this->arr[$k]['rowspan'] = $v['child_bottom_num']; // 行合並數
$this->arr[$k]['colspan'] = $v['child_bottom_num'] == 0 ? $this->columns - $v['column'] + 1 : 0; //列合並數
}
return $this->get_tree_arr();
}
/**
* 獲取數組
* */
public function get_tree_arr(){
return is_array($this->arr) ? $this->arr : false;
}
/**
* 按arrparentid/id號依次重新排序數組
* */
public function sort_arr(){
// 要進行排序的欄位
foreach ($this->arr as $k => $v){
$order_pid_arr[$k] = $v['arrparentid'];
$order_iscost[] = $v['sort'];
$order_id_arr[$k] = $v['id'];
}
// 先根據arrparentid排序,再根據排序,id號排序
array_multisort(
$order_pid_arr, SORT_ASC, SORT_STRING,
$order_iscost, SORT_DESC, SORT_NUMERIC,
$order_id_arr, SORT_ASC, SORT_NUMERIC,
$this->arr);
// 獲取每一個節點層次
for ($column = 1; $column <= $this->columns; $column++) {
$row_level = 0;
foreach ($this->arr as $key => $node){
if ($node['column'] == $column){
$row_level++;
$this->arr[$key]['column_level'] = $row_level;
}
}
}
// 重新計算以ID作為鍵名
foreach ($this->arr as $k=>$v) {
$arr[$v['id']] = $v;
}
$this->arr = $arr;
}
/**
* 得到父級數組
* @param int
* @return array
*/
public function get_parent($myid){
$newarr = array();
if(!isset($this->arr[$myid])) return false;
$pid = $this->arr[$myid]['parentid'];
$pid = $this->arr[$pid]['parentid'];
if(is_array($this->arr)){
foreach($this->arr as $id => $a){
if($a['parentid'] == $pid) $newarr[$id] = $a;
}
}
return $newarr;
}
/**
* 得到子級數組
* @param int
* @return array
*/
public function get_child($myid){
$a = $newarr = array();
if(is_array($this->arr)){
foreach($this->arr as $id => $a){
if($a['parentid'] == $myid) $newarr[$id] = $a;
}
}
return $newarr ? $newarr : false;
}
/**
* 獲取當前節點所在的層級
* @param $myid 當前節點ID號
* */
public function get_level($myid, $init = true){
static $level = 1;
if($init) $level = 1;
if ($this->arr[$myid]['parentid']) {
$level++;
$this->get_level($this->arr[$myid]['parentid'], false);
}
return $level;
}
/**
* 獲取當前節點所有底層節點(沒有子節點的節點)的數量
* @param $myid 節點ID號
* @param $init 第一次載入將情況static變數
* */
public function get_child_count($myid, $init = true){
static $count = 0;
if($init) $count = 0;
if(!$this->get_child($myid) && $init) return 0;
if($childarr = $this->get_child($myid)){
foreach ($childarr as $v){
$this->get_child_count($v['id'], false);
}
}else{
$count++;
}
return $count;
}
/**
* 獲取節點所有子節點ID號
* @param $catid 節點ID號
* @param $init 第一次載入將情況static初始化
* */
public function get_arrchildid($myid, $init = true) {
static $childid;
if($init) $childid = '';
if(!is_array($this->arr)) return false;
foreach($this->arr as $id => $a){
if($a['parentid'] == $myid) {
$childid = $childid ? $childid.','.$a['id'] : $a['id'];
$this->get_arrchildid($a['id'], false);
}
}
return $childid ;
}
/**
* 獲取該節點所有父節點ID號
* @param $id 節點ID號
* */
public function get_arrparentid($id, $arrparentid = '') {
if(!is_array($this->arr)) return false;
$parentid = $this->arr[$id]['parentid'];
if($parentid > 0) $arrparentid = $arrparentid ? $parentid.','.$arrparentid : $parentid;
if($parentid) $arrparentid = $this->get_arrparentid($parentid, $arrparentid);
return $arrparentid;
}
/**
* 獲取節點所在地行定位
* @param $myid 節點ID號
*/
public function get_row_location($myid){
$nodearr = $this->arr;
// 獲取每一個節點所在行的位置
foreach ($nodearr as $key => $node){
if($myid == $node['id']) {
$node_row_count = 0;
$arrparentid = explode(',', $node['arrparentid']);
// 所有父節點小於當前節點層次的底層節點等於0的元素
foreach ($arrparentid as $pid){
foreach ($nodearr as $node_row){
if($node_row['column'] == $nodearr[$pid]['column'] && $nodearr[$pid]['column_level'] > $node_row['column_level'] && $node_row['child_bottom_num'] == 0){
$node_row_count ++;
}
}
}
// 所有當前節點並且節點層次(rowid_level)小於當前節點層次的個數
foreach ($nodearr as $node_row){
if($node['column'] == $node_row['column'] && $node_row['column_level'] < $node['column_level']){
$node_row_count += $node_row['child_bottom_num'] ? $node_row['child_bottom_num'] : 1;
}
}
$node_row_count++;
break;
}
}
return $node_row_count;
}
/**
* 獲取表格的行數
* */
public function get_rows(){
$row = 0;
foreach ($this->arr as $key => $node){
if($node['child_bottom_num'] == 0){
$rows++; // 總行數
}
}
return $rows;
}
/**
* 獲取表格的列數
* */
public function get_columns(){
$columns = 0 ;
foreach ($this->arr as $key => $node){
if($node['column'] > $columns){
$columns = $node['column']; // 總列數
}
}
return $columns;
}
/**
* 獲取分類的表格展現形式(不包含表頭)
* */
public function get_treetable(){
$table_string = '';
for($row = 1; $row <= $this->rows; $row++){
$table_string .= "\r\t<tr>";
foreach ($this->arr as $v){
if($v['row'] == $row){
$rowspan = $v['rowspan'] ? "rowspan='{$v['rowspan']}'" : '';
$colspan = $v['colspan'] ? "colspan='{$v['colspan']}'" : '';
$table_string .= "\r\t\t<td {$rowspan} {$colspan}>
{$v['name']}
</td>";
}
}
$table_string .= "\r\t</tr>";
}
return $table_string;
}
}
?>
F. 什麼是 無限極分類(PHP。資料庫)
那是一種關聯關系....sql 里可以叫"自連接" 假設:表 Category 有以下欄位: Id(PK),Cate_Name(varchar),Cate_Parent_Id(int) 數據: Id(編號ID) Cate_Name(類別名稱) Cate_Parent_Id(父級Id) 1 BaseCategory 0 2 News 1 3 Article 1 4 Story 3 說明: Id 為 1 的基類別(沒有父級類別) News,Article 為 基類別下的子分類 Story 為 Article 下的子分類 層次關系: 0 - 2 - 3 - 4 這樣就可以簡單實現無限分類的資料庫的設計了 使用: 給出Id 獲取到它的父類別和所有子類別 Function getParentCategory($Id){ $sql = "select * from Category where Id = (select Cate_Parent_Id from Category where Id = $Id)"; $rs = mysql_query($sql,$conn); ...... //省事期間,給出偽代碼吧 if(記錄不存在 或者 $Id = 1){ return false; //無父級或不存在 }else{ return 查詢出的父級數據數組; } } Function getChildCategory($PId){ $sql = "select * from Category where Cate_Parent_Id = $PId"; 存在則返回數據數組 否則返回false } 上面只是簡單說明下大致思路.. php,J2ee的我沒手寫過,都是通過支持ORM的MVC框架去配置出來的. asp的倒是寫過,需要的話,可以發你 只要邏輯關系整清楚了,就不難了...至於頁面展示,可以用JS或者AJAX
G. PHP無限極分類的幾種方法
用的較多的是採用遞歸的方式來實現無限極分類,但是如果對於讀大於寫的情況,可以採用預排序遍歷樹演算法的方式來實現(也推薦用這種方式),針對YII框架或是Laravel框架都有相應的第三方擴展已經實現了該演算法。如果自己有時間也可以自己琢磨琢磨
H. 無限極產品現在有哪些種類
無限極產品現在有五大系列、六大品牌,共160餘款產品,官網上都有介紹。雖然我就聽過幾款無限極的產品,但是據說質量不錯,尤其是對原材料的挑選很嚴格,這一點還挺好的,畢竟入口的東西,標准嚴格了讓人放心。
I. 無限級分類效率,用遞歸做的無限級分類,速度太慢了,有沒有好有優化方案,分享一下
[1 ]設計表 Tree:
ID,Name,ParentID,IDHelper
1,分類1,0,1-
2,分類1.1,1,1-2-
3,分類1.2,1,1-3-
4,分類2,0,4-
5,分類2.1,4,4-5-
[2] 查詢所有一級分類:
select * from tree where parentID = 0
[3]查詢某一級的下一級:
select * from tree where parentID = 1
[4]查詢某一級的所有下級:
select * from tree where IDHelper like 『1-』
[5]在你做一棵樹的時候,第一次不需要全部查詢出來,只需要顯示一級分類即可;
當用戶點擊某一個再載入他下面的一級(AJAX);
[6]IDHelper 怎麼計算,IDHelper 總是 = 父分類的IDHelper + 當前ID + 分割符
注意每次修改刪除等操作時需要更新,或者做成sql的[公式列]自動計算;
[7]注意ParentID,IDHelper不能亂套,否則會死循環;
[8]其他沒什麼了,應該不需要無限遞歸就可以完成各種操作,而且效率不是問題;
J. 不用遞歸 怎麼計算無限極分類 php+mysql
直接舉個例子:
<?php
header("content-type:text/html;charset=utf-8");
$categories=array(
array('id'=>1,'name'=>'電腦','pid'=>0),
array('id'=>2,'name'=>'手機','pid'=>0),
array('id'=>3,'name'=>'筆記本','pid'=>1),
array('id'=>4,'name'=>'台式機','pid'=>1),
array('id'=>5,'name'=>'智能機','pid'=>2),
array('id'=>6,'name'=>'功能機','pid'=>2),
array('id'=>7,'name'=>'超級本','pid'=>3),
array('id'=>8,'name'=>'游戲本','pid'=>3),
);
/*======================非遞歸實現========================*/
$tree=array();
//第一步,將分類id作為數組key,並創建children單元
foreach($categoriesas$category){
$tree[$category['id']]=$category;
$tree[$category['id']]['children']=array();
}
//第二步,利用引用,將每個分類添加到父類children數組中,這樣一次遍歷即可形成樹形結構。
foreach($treeas$key=>$item){
if($item['pid']!=0){
$tree[$item['pid']]['children'][]=&$tree[$key];//注意:此處必須傳引用否則結果不對
if($tree[$key]['children']==null){
unset($tree[$key]['children']);//如果children為空,則刪除該children元素(可選)
}
}
}
////第三步,刪除無用的非根節點數據
foreach($treeas$key=>$category){
if($category['pid']!=0){
unset($tree[$key]);
}
}
print_r($tree);
?>