ホームページ  >  記事  >  バックエンド開発  >  無制限の下位レベルの分類ツリー出力を実現するための php+mysql クエリの例

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

coldplay.xixi
coldplay.xixi転載
2020-08-15 17:03:213469ブラウズ

無制限の下位レベルの分類ツリー出力を実現するための 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.="<span style=&#39;color:#CCCCCC&#39;>".$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(&#39;id&#39;=>1,&#39;name&#39;=>&#39;电脑&#39;,&#39;pid&#39;=>0),
  array(&#39;id&#39;=>2,&#39;name&#39;=>&#39;手机&#39;,&#39;pid&#39;=>0),
  array(&#39;id&#39;=>3,&#39;name&#39;=>&#39;笔记本&#39;,&#39;pid&#39;=>1),
  array(&#39;id&#39;=>4,&#39;name&#39;=>&#39;台式机&#39;,&#39;pid&#39;=>1),
  array(&#39;id&#39;=>5,&#39;name&#39;=>&#39;智能机&#39;,&#39;pid&#39;=>2),
  array(&#39;id&#39;=>6,&#39;name&#39;=>&#39;功能机&#39;,&#39;pid&#39;=>2),
  array(&#39;id&#39;=>7,&#39;name&#39;=>&#39;超级本&#39;,&#39;pid&#39;=>3),
  array(&#39;id&#39;=>8,&#39;name&#39;=>&#39;游戏本&#39;,&#39;pid&#39;=>3),
);

目標は、これを次の構造に変換することです:

电脑
—笔记本
——-超级本
——-游戏本
—台式机
手机
—智能机
—功能机

配列で表される場合は、それを格納するために子キーを追加できます。

処理プロセス

:

array(
  //1对应id,方便直接读取
  1 => array(
    &#39;id&#39;=>1,
    &#39;name&#39;=>&#39;电脑&#39;,
    &#39;pid&#39;=>0,
    children=>array(
      &array(
        &#39;id&#39;=>3,
        &#39;name&#39;=>&#39;笔记本&#39;,
        &#39;pid&#39;=>1,
        &#39;children&#39;=>array(
          //此处省略
        )
      ),
      &array(
        &#39;id&#39;=>4,
        &#39;name&#39;=>&#39;台式机&#39;,
        &#39;pid&#39;=>1,
        &#39;children&#39;=>array(
          //此处省略
        )
      ),
    )
  ),
  //其他分类省略
)
print_r($tree);印刷結果は以下の通りです:

$tree = array();
//第一步,将分类id作为数组key,并创建children单元
foreach($categories as $category){
  $tree[$category[&#39;id&#39;]] = $category;
  $tree[$category[&#39;id&#39;]][&#39;children&#39;] = array();
}
//第二部,利用引用,将每个分类添加到父类children数组中,这样一次遍历即可形成树形结构。
foreach ($tree as $k=>$item) {
  if ($item[&#39;pid&#39;] != 0) {
    $tree[$item[&#39;pid&#39;]][&#39;children&#39;][] = &$tree[$k];
  }
}

利点:

デメリット: カテゴリ数が膨大な場合、PHPで処理すると、上下関係が明確になり、変更が容易です。

関連する推奨事項:
プログラミング ビデオ コース

以上が無制限の下位レベルの分類ツリー出力を実現するための php+mysql クエリの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。