ホームページ >バックエンド開発 >PHPチュートリアル >PHP Infinitus分類機能の実装方法例を詳しく解説

PHP Infinitus分類機能の実装方法例を詳しく解説

怪我咯
怪我咯オリジナル
2018-05-14 16:01:262796ブラウズ

この記事では、PHP Infinitus 分類関数の実装方法を主に紹介し、PHP で Infinitus 分類を実装するための具体的なアイデア、実装コード、および関連する注意事項をサンプルの形で詳しく分析します。この記事では、PHP で無限分類関数を実装する方法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです。

プログラムを開発するとき、すべての列 (第 1 レベルの列、第 2 レベルの列、第 3 レベルの列などを含む) とフォームを取得する必要がある場合があります。親子関係構造に従ったツリー。再帰または参照を使用できます (php の参照は C または C++ のポインターに似ていますが、別の言い方にすぎません)。

参照による無限分類の実現

アイデア:

1. つまり、処理されるすべてのデータは、主キー ID (pk) で添え字が付いた配列にパッケージ化され、pid を使用して取得できるようになります。対応する親列。

2. ラップされたデータをループし、それがルート ノードの場合はその参照をツリーに追加し、それ以外の場合はその参照を親クラスの子要素に追加します。このように、ルート ノードのみがツリーに追加されますが、各ルート ノードに子要素がある場合は、子要素への参照が含まれます。したがって、樹形を形成することができます。

コードは以下の通りです

/**
 * 把返回的数据集转换成Tree
 * @param array $list 要转换的数据集
 * @param string $pk 自增字段(栏目id)
 * @param string $pid parent标记字段
 * @return array
 * @author dqs <1696232133@qq.com>
 */
function make_tree($list,$pk=&#39;id&#39;,$pid=&#39;pid&#39;,$child=&#39;_child&#39;,$root=0){
  $tree=array();
  $packData=array();
  foreach ($list as $data) {
    $packData[$data[$pk]] = $data;
  }
  foreach ($packData as $key =>$val){
    if($val[$pid]==$root){//代表跟节点
      $tree[]=& $packData[$key];
    }else{
      //找到其父类
      $packData[$val[$pid]][$child][]=& $packData[$key];
    }
  }
  return $tree;
}

データ構造は以下の通りです

実行結果は以下の通りです

Array
(
  [0] => Array
    (
      [id] => 6
      [pid] => 0
      [title] => 测试1
      [url] => test1
      [sort] => 0
      [create_time] => 1464076199
      [update_time] => 1464076199
      [status] => 1
      [target] => 0
    )
  [1] => Array
    (
      [id] => 7
      [pid] => 0
      [title] => 测试2
      [url] => test2
      [sort] => 0
      [create_time] => 1464076218
      [update_time] => 1464076218
      [status] => 1
      [target] => 0
    )
  [2] => Array
    (
      [id] => 1
      [pid] => 0
      [title] => 首页
      [url] => Index/index
      [sort] => 1
      [create_time] => 1379475111
      [update_time] => 1379923177
      [status] => 1
      [target] => 0
    )
  [3] => Array
    (
      [id] => 2
      [pid] => 0
      [title] => 博客
      [url] => Article/index?category=blog
      [sort] => 2
      [create_time] => 1379475131
      [update_time] => 1379483713
      [status] => 1
      [target] => 0
      [_child] => Array
        (
          [0] => Array
            (
              [id] => 4
              [pid] => 2
              [title] => 个人博客
              [url] => ownblog
              [sort] => 0
              [create_time] => 1464075558
              [update_time] => 1464075558
              [status] => 1
              [target] => 0
              [_child] => Array
                (
                  [0] => Array
                    (
                      [id] => 8
                      [pid] => 4
                      [title] => 新浪博客
                      [url] => sinaBlog
                      [sort] => 0
                      [create_time] => 1464077276
                      [update_time] => 1464077276
                      [status] => 1
                      [target] => 0
                    )
                )
            )
          [1] => Array
            (
              [id] => 5
              [pid] => 2
              [title] => 他人博客
              [url] => otherBlog
              [sort] => 0
              [create_time] => 1464075582
              [update_time] => 1464075582
              [status] => 1
              [target] => 0
            )
        )
    )
  [4] => Array
    (
      [id] => 3
      [pid] => 0
      [title] => 官网
      [url] => http://www.onethink.cn
      [sort] => 3
      [create_time] => 1379475154
      [update_time] => 1387163458
      [status] => 1
      [target] => 0
    )
)

OneThinkにInfinitus分類機能を追加

/**
 * 把返回的数据集转换成Tree
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @param string $level level标记字段
 * @return array
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function list_to_tree($list, $pk=&#39;id&#39;, $pid = &#39;pid&#39;, $child = &#39;_child&#39;, $root = 0) {
  // 创建Tree
  $tree = array();
  if(is_array($list)) {
    // 创建基于主键的数组引用
    $refer = array();
    foreach ($list as $key => $data) {
      $refer[$data[$pk]] =& $list[$key];
    }
    foreach ($list as $key => $data) {
      // 判断是否存在parent
      $parentId = $data[$pid];
      if ($root == $parentId) {
        $tree[] =& $list[$key];
      }else{
        if (isset($refer[$parentId])) {
          $parent =& $refer[$parentId];
          $parent[$child][] =& $list[$key];
        }
      }
    }
  }
  return $tree;
}

再帰によるInfinitus分類を実現

アイデア:

1 .ループを使用して、すべてのルート ノードを個別に取得します。

2. 各ノードを取得するときは、元のデータからノードを削除し、元のデータが空になるまですべての子ノードを再帰的に取得します。

コードは次のように実装されます:

function make_tree1($list,$pk=&#39;id&#39;,$pid=&#39;pid&#39;,$child=&#39;_child&#39;,$root=0){
  $tree=array();
  foreach($list as $key=> $val){
    if($val[$pid]==$root){
      //获取当前$pid所有子类
        unset($list[$key]);
        if(! empty($list)){
          $child=make_tree1($list,$pk,$pid,$child,$val[$pk]);
          if(!empty($child)){
            $val[&#39;_child&#39;]=$child;
          }
        }
        $tree[]=$val;
    }
  }
  return $tree;
}

効果のスクリーンショットは次のとおりです:

以上がPHP Infinitus分類機能の実装方法例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。