無制限の下位レベルの分類ツリー出力を実現するための php+mysql クエリの例

coldplay.xixi
リリース: 2023-04-09 14:02:02
転載
3343 人が閲覧しました

無制限の下位レベルの分類ツリー出力を実現するための php+mysql クエリの例

この記事の例では、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.="".$name."";
}
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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:jb51.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!