この記事の例では、php mysql クエリを通じて無制限の下位レベルの分類ツリー出力を実装する方法について説明します。参考までに皆さんと共有してください。詳細は次のとおりです。
ここで紹介した PHP と mysql を組み合わせて無限従属ツリー出力をクエリすると、実際には無限分類になります。無制限の PHP 分類の例をいくつかまとめました。
[関連する学習の推奨事項: php プログラミング (ビデオ)、mysql ビデオ チュートリアル]
ツリー出力:
function get_array($user_id,$top=0){ global $mysql,$_G; $sql = "select user_id as name from `{spreads_users}` where p1.spreads_userid='{$user_id}'"; $rows= $mysql->db_fetch_arrays($sql); if($top==1){ $arr[0]['name']=$user_id; $arr[0]['children']=array(); } $top=$top+1; foreach ($rows as $key=>$value) { $r = get_array($value['name']); //调用函数,传入参数,继续查询下级 $arr[0]['children'][$key]['name']= $value['username']; //组合数组 if(is_array($r)){ $arr[0]['children'][$key]['children']= $r[0]['children']; } $i++; } return $arr; } $list = get_array("1000",1); //调用函数1000是顶级ID echo 'var data='.json_encode($list);
これは出力配列であり、json に転送されます
例:
テーブル構造: id フィールドは分類識別子であり、 name フィールドは分類名、 Father_id フィールドはそれが属する親カテゴリの ID、 path フィールドはカテゴリの祖先のコレクションを格納するカテゴリ パス、 isdir はそれがディレクトリであるかどうかを決定します。
表示関数:
//$count为分类等级 sort_list($str,$fatherid,$count) { $rs = $this->sql->re_datas("select * from sort where father_id = fatherid"); $num = $this->sql->sql_numrows(); $i=0; $n = 1; while(isset($rs[$i])) { $name = ""; for($n = 1 ; $n < $count ; $n ) { $name.="│ "; } if($i 1==$num) { $name.="└─".$rs[$i][name]; } else { $name.="├─".$rs[$i][name]; } if($rs[$i][isdir]) { $str.="<span style='color:#CCCCCC'>".$name."</span>"; } else { $str.=$name"; } $temp = $count 1; $str = $this->sort_list($str,$rs[$i][id],$temp); $i ; } return $str; }
$this->sql オブジェクトは SQL 操作クラス オブジェクトであり、re_datas() 関数は戻り値を返します。見つかった配列、および sql_numrows() 関数はクエリされた番号を返します。
呼び出しメソッド:
$sort_list = sort_list($sort_list,0,1);
例:
テーブル:category
id int 主キー、自動インクリメント
name varchar カテゴリ名
pid int 親クラス ID 、デフォルトは 0
最上位カテゴリの pid はデフォルトで 0 です。特定のカテゴリのサブカテゴリ ツリーを取り出したいと考えています。基本的な考え方は再帰です。もちろん、効率の問題のため、データベースに再帰的にクエリを実行するたびにお勧めできません。通常のアプローチは、最初にすべてのカテゴリを抽出することです。 、それらを PHP 配列に保存し、処理します。最後に、結果をキャッシュして、次のリクエストの効率を向上させることができます。
最初に元の配列を構築しましょう。これはデータベースから直接取得できます:
$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), );
目標は、これを次の構造に変換することです:
电脑 —笔记本 ——-超级本 ——-游戏本 —台式机 手机 —智能机 —功能机
配列で表される場合は、それを格納するために子キーを追加できます。
処理プロセス:array(
//1对应id,方便直接读取
1 => array(
'id'=>1,
'name'=>'电脑',
'pid'=>0,
children=>array(
&array(
'id'=>3,
'name'=>'笔记本',
'pid'=>1,
'children'=>array(
//此处省略
)
),
&array(
'id'=>4,
'name'=>'台式机',
'pid'=>1,
'children'=>array(
//此处省略
)
),
)
),
//其他分类省略
)
print_r($tree);印刷結果は以下の通りです:
$tree = array(); //第一步,将分类id作为数组key,并创建children单元 foreach($categories as $category){ $tree[$category['id']] = $category; $tree[$category['id']]['children'] = array(); } //第二部,利用引用,将每个分类添加到父类children数组中,这样一次遍历即可形成树形结构。 foreach ($tree as $k=>$item) { if ($item['pid'] != 0) { $tree[$item['pid']]['children'][] = &$tree[$k]; } }
利点:
デメリット: カテゴリ数が膨大な場合、PHPで処理すると、上下関係が明確になり、変更が容易です。
関連する推奨事項:プログラミング ビデオ コース
以上が無制限の下位レベルの分類ツリー出力を実現するための php+mysql クエリの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。