Maison  >  Article  >  développement back-end  >  Comment implémenter la fonction de classification infinie en PHP

Comment implémenter la fonction de classification infinie en PHP

墨辰丷
墨辰丷original
2018-05-23 17:21:591536parcourir

Cet article présente principalement la méthode d'implémentation de la fonction de classification PHP Infinitus et analyse en détail les idées spécifiques, le code d'implémentation et les précautions associées pour que PHP implémente la classification Infinitus sous forme d'exemples. Les amis dans le besoin peuvent s'y référer

L'exemple de cet article décrit la méthode d'implémentation de la fonction de classification PHP Infinis. Partagez-le avec tout le monde pour votre référence, comme suit :

Lors du développement d'un programme, nous devons parfois obtenir toutes les colonnes (y compris les colonnes de premier niveau, les colonnes de deuxième niveau, les colonnes de troisième niveau, etc.) Relations former une structure arborescente. Vous pouvez utiliser la récursivité ou la référence (les références en php sont similaires aux pointeurs en C ou C++, juste une autre façon de le dire).

Réaliser la classification Infinitus par référence

Idée :

1. Autrement dit, toutes les données à traiter sont regroupées dans des identifiants de clé primaire indicés (. pk) tableau pour faciliter l’obtention de la colonne parent correspondante avec pid.

2. Parcourez les données encapsulées, s'il s'agit du nœud racine, ajoutez sa référence à l'arborescence, sinon, ajoutez sa référence à l'élément enfant de sa classe parent. De cette façon, bien que seul le nœud racine soit ajouté à l'arborescence, si chaque nœud racine a des éléments enfants, il contient des références aux éléments enfants. Par conséquent, il peut former une forme d’arbre.

Le code est le suivant

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

La structure des données est la suivante :

Résultat de l'exécution Comme suit

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

Fonction de classification Infinitus attachée dans 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;
}

Réalisez une classification infinie par récursion

Idées :

1. Utilisez des boucles pour obtenir respectivement tous les nœuds racines.

2. Lors de l'obtention de chaque nœud, supprimez le nœud des données d'origine et obtenez tous ses nœuds enfants de manière récursive jusqu'à ce que les données d'origine soient vides.

Le code est implémenté comme suit :

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

La capture d'écran de l'effet est la suivante :

Ce qui précède représente l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.


Recommandations associées :

PHPMéthodes pour exécuter dynamiquement les astuces code_php

PHPPlan de croissance technologique du programmeur_php Digest

PHPFormulaire de juge ou Comment vérifier si les données de le paramètre URL est un entier_php conseils

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn