Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie eine unendliche Klassifizierungsfunktion in PHP

So implementieren Sie eine unendliche Klassifizierungsfunktion in PHP

墨辰丷
墨辰丷Original
2018-05-23 17:21:591532Durchsuche

In diesem Artikel wird hauptsächlich die Implementierungsmethode der PHP-Infinitus-Klassifizierungsfunktion vorgestellt und die spezifischen Ideen, der Implementierungscode und die damit verbundenen Vorsichtsmaßnahmen für PHP zur Implementierung der Infinitus-Klassifizierung in Form von Beispielen detailliert analysiert.

Das Beispiel in diesem Artikel beschreibt die Implementierungsmethode der PHP Infinitus-Klassifizierungsfunktion. Geben Sie es wie folgt als Referenz an alle weiter:

Bei der Entwicklung eines Programms müssen wir manchmal alle Spaltenbeziehungen (einschließlich Spalten der ersten Ebene, Spalten der zweiten Ebene, Spalten der dritten Ebene usw.) abrufen eine Baumstruktur bilden. Sie können Rekursion oder Referenz verwenden (Referenzen in PHP ähneln Zeigern in C oder C++, nur um es anders auszudrücken).

Infinitus-Klassifizierung durch Referenz realisieren

Idee:

1 Das heißt, alle zu verarbeitenden Daten werden in abonnierte Primärschlüssel-IDs verpackt. pk)-Array, um das Abrufen der entsprechenden übergeordneten Spalte mit pid zu erleichtern.

2. Durchlaufen Sie die umschlossenen Daten. Wenn es sich um den Stammknoten handelt, fügen Sie seinen Verweis auf den Baum hinzu, andernfalls fügen Sie seinen Verweis auf das untergeordnete Element seiner übergeordneten Klasse hinzu. Auf diese Weise wird zwar nur der Wurzelknoten zum Baum hinzugefügt, aber wenn jeder Wurzelknoten untergeordnete Elemente hat, enthält er Verweise auf die untergeordneten Elemente. Daher kann es eine Baumform bilden.

Der Code ist wie folgt

/**
 * 把返回的数据集转换成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;
}

Die Datenstruktur ist wie folgt:

Das Ausführungsergebnis ist wie folgt

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
    )
)

Zusätzliche Infinitus-Klassifizierungsfunktion in OneThink

/**
 * 把返回的数据集转换成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;
}

Erzielen einer unendlichen Klassifizierung durch Rekursion

Ideen:

1. Verwenden Sie Schleifen, um jeweils alle Wurzelknoten zu erhalten.

2. Entfernen Sie beim Abrufen jedes Knotens den Knoten aus den Originaldaten und rufen Sie alle seine untergeordneten Knoten rekursiv ab, bis die Originaldaten leer sind.

Der Code ist wie folgt implementiert:

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;
}

Der Screenshot des Effekts ist wie folgt:

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich sein wird.


Verwandte Empfehlungen:

PHPMethoden zur dynamischen Ausführung von code_php-Tipps

PHPProgrammer's Technology Growth Plan_php Digest

PHPBeurteilen Sie das FORM-Formular oder wie Sie überprüfen können, ob die Daten vorliegen Der URL-Parameter ist ein integer_php Tips

Das obige ist der detaillierte Inhalt vonSo implementieren Sie eine unendliche Klassifizierungsfunktion in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn