Maison  >  Article  >  développement back-end  >  Comment implémenter une classification illimitée en PHP

Comment implémenter une classification illimitée en PHP

迷茫
迷茫original
2017-02-04 16:46:413879parcourir

La classification infinie est une technique de conception souvent utilisée en développement.Cet article présente principalement la méthode d'implémentation de la classification infinie en PHP. Si vous en avez besoin, vous pouvez en apprendre davantage.

La classification infinie est une technique de conception souvent utilisée dans le développement, comme les répertoires de sites Web, les structures de département et les classifications d'articles. L'auteur estime qu'il joue un grand rôle dans la conception de la structure hiérarchique des tableaux. Par exemple, sur certaines plateformes,

Remplissez l'invitant, il s'agit d'une relation supérieur-subordonné. Le supérieur aura plusieurs subordonnés, et les subordonnés auront leurs propres branches. La plupart d'entre elles sont implémentées en utilisant des idées récursives. Sans plus tarder, passons d’abord en revue l’implémentation de la récursivité

Récursivité (une technique de programmation dans laquelle un programme s'appelle) :

1. $_GLOBALS[résultat]

2. résultat $ statique

3. Référence des paramètres &

Exemple : Traversée 1-10

$i=0;
function deeploop( $i ){
  global $i;
  $i++;
  echo $i;
  if( $i<10 ){
    deeploop($i);
  }
 
}
 
function deeploop( ){
  static $i=0;
  $i++;
  echo $i;
  if( $i<10 ){
    deeploop($i);
  }
 
}
 
 
function deeploop( &$i=0 ){
  $i++;
  echo $i;
  if( $i<10 ){
    deeploop($i);
  }
 
}

1. Implémentation de la classification infinie :

1. Définissez l'identifiant parent dans la conception du tableau et définissez l'identifiant parent supérieur sur 0 pour établir un arbre généalogique. Chaque catégorie doit enregistrer son identifiant parent. (pid=0 représente le niveau supérieur)

id pid catename cateorder createtime (identifiant de clé primaire, identifiant parent, nom de catégorie, tri des catégories, heure de création)

Exemples : structure des catégories du site Web ; structure des catégories de la restauration ; structure des commentaires ;

2. Classification illimitée du chemin complet (enregistrez tous les identifiants parents dans l'ordre dans un champ)

id chemin catename cateorder createtime (identifiant de clé primaire, identifiant parent dans l'ordre séparé par des virgules, nom de catégorie, tri des catégories, heure de création)

Avantages et inconvénients :

La requête de chemin complet est pratique et la maintenance des données est légèrement plus compliquée lors du déplacement de la classification ;

2. Exemple de mise en œuvre (annuaire du site Web) :

Tableau de classement :

 #父级Id递归法
  CREATE TABLE `deepcate`(
    `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `pid` int(11) NOT NULL DEFAULT 0,
    `catename` char(25) NOT NULL,
    `cateorder` int(6) ,
    `createtime` date
  )ENGINE=INNODB default CHARSET=utf8;
   
   
  //数据
  INSERT INTO `deepcate` VALUES(1,0,'图片',null,'2016-11-01'),
                ( 2,1,'美女',null,'2016-11-01'),
                ( 3,1,'新闻',null,'2016-11-01'),
                ( 4,2,'足球宝贝',null,'2016-11-01'),
                ( 5,2,'日韩明星',null,'2016-11-01'),
                ( 6,5,'美女写真',null,'2016-11-01');
                 
  #全路径
  CREATE TABLE `qljcate` (
    `id` int(11) NOT NULL,
    `path` char(255) ,
    `catename` char(25) NOT NULL,
    `cateorder` int(6),
    `createtime` date
  )ENGINE=INNODB default CHARSET=utf8;
   
  INSERT INTO `qljcate` VALUES( 1,null,'图片',null,'2016-11-01'),
                ( 2,1,'美女图片',null,'2016-11-01'),
            ( 3,1,2,'足球宝贝',null,'2016-11-01'),
                ( 4,1,2,'日韩明星',null,'2016-11-01'),
                ( 5,1,2,4,'美女写真',null,'2016-11-01');

Obtenez le chemin du répertoire où se trouve l'image :

#父级Id递归法
  CREATE TABLE `deepcate`(
    `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `pid` int(11) NOT NULL DEFAULT 0,
    `catename` char(25) NOT NULL,
    `cateorder` int(6) ,
    `createtime` date
  )ENGINE=INNODB default CHARSET=utf8;
   
   
  //数据
  INSERT INTO `deepcate` VALUES(1,0,'图片',null,'2016-11-01'),
                ( 2,1,'美女',null,'2016-11-01'),
                ( 3,1,'新闻',null,'2016-11-01'),
                ( 4,2,'足球宝贝',null,'2016-11-01'),
                ( 5,2,'日韩明星',null,'2016-11-01'),
                ( 6,5,'美女写真',null,'2016-11-01');
                 
  #全路径
  CREATE TABLE `qljcate` (
    `id` int(11) NOT NULL,
    `path` char(255) ,
    `catename` char(25) NOT NULL,
    `cateorder` int(6),
    `createtime` date
  )ENGINE=INNODB default CHARSET=utf8;
   
  INSERT INTO `qljcate` VALUES( 1,null,'图片',null,'2016-11-01'),
                ( 2,1,'美女图片',null,'2016-11-01'),
            ( 3,1,2,'足球宝贝',null,'2016-11-01'),
                ( 4,1,2,'日韩明星',null,'2016-11-01'),
                ( 5,1,2,4,'美女写真',null,'2016-11-01');

*Points à noter :

Une catégorie mobile ne peut pas être déplacée en dessous d'elle-même et de ses sous-catégories ; une catégorie peut être supprimée (seule la catégorie la plus basse peut être supprimée, et les catégories sans sous-catégories ; en d'autres termes, elle ne peut être supprimée qu'à partir du niveau le plus bas).

Vous pensez à toutes les catégories d’images sous types d’images ?​

 #pid 父级id实现法
  function GetAllcate( $id,&$result=array() ){
    $sql = "SELECT * FROM deepcate WHERE pid in ({$id})";
    $query = mysql_query( $sql );
    $row = mysql_fetch_assoc( $query );
    if( mysql_num_rows($row)>0 )
    {
      $idlist = array();
      while( $row ){
        $result[] = $row;
        $idlist[] = $row['id']; 
      }
      $id = implode(',',$idlist);
      GetAllcate( $id,$result );
     
    }
     
    $result = array_unique( $result );
    return $result;
  }

Cette méthode est plus adaptée pour interroger tous les livres et articles de la catégorie parent. . . Bien entendu, le chemin complet peut être obtenu directement, je ne le mentionnerai donc pas ici.

En fonctionnement réel, nous pouvons concevoir une structure de table raisonnable en fonction de la situation réelle.

Par exemple, si une chaîne de magasins met en œuvre la gestion des produits, les paramètres de compte du magasin auront une relation supérieur-subordonné. En fonction de la partition du point d'agent, ces subordonnés peuvent avoir leurs propres subordonnés, donc l'utilisation de cette méthode de classification illimitée sera. plus flexible pour faire face à cette situation. Avec ce type de système de relation, il vous suffit de définir chaque niveau de compte pour définir la répartition des autorisations pour les différents magasins.

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