Home  >  Article  >  Backend Development  >  Two ways to implement unlimited classification in PHP

Two ways to implement unlimited classification in PHP

韦小宝
韦小宝Original
2018-02-05 09:38:471688browse

This article is divided into two situations. It introduces the implementation of infinite classification in PHP under the condition of recursion and without using recursion. PHPInfinite classification is very common in our development process. , we will often use PHP infinite classification in our future development, so we should master it. Friends who don’t know much about how to implement infinite classification in PHP can refer to this article

After working in PHP for so long, I found that an indispensable application module of the backend management system is the classification of columns. Generally, the columns should be made into infinite levels, which means that each column can theoretically add sub-columns. In my opinion, handling this situation is not very complicated overall. The only relatively difficult point is the query of infinite columns.

Let me give you a brief introduction to this situation. There are generally two ways to query this kind of infinite column. One of them is to use the stack mechanism, and the other is Use the recursive function method (of course the recursive function implementation mechanism is also implemented with the help of the stack). We will introduce these two methods separately below.

Recursive function implementation method

As mentioned above, recursive functions are also implemented with the help of the stack mechanism, but the underlying stack processing is difficult for programmers. It is transparent, and programmers only need to care about the implementation logic of the application. Therefore, it is easier to understand using recursion to deal with the above problems, and the code is relatively concise.

Since we are using a recursive function, we know from the name that we must use a custom function. Let me first briefly talk about its implementation ideas, and we will reflect the specific details in the code.

The main job of each layer's function is to find the column whose parent ID is the current ID. After finding it, call its own function again and use the found column's ID as the parent ID of the next layer.

The flow chart is as follows

Figure 1

I don’t know if you can understand the above explanation. It doesn’t matter. Let’s look at the code directly.

<?php
$channels = array(
  array(&#39;id&#39;=>1,&#39;name&#39;=>"衣服",&#39;parId&#39;=>0),
  array(&#39;id&#39;=>2,&#39;name&#39;=>"书籍",&#39;parId&#39;=>0),
  array(&#39;id&#39;=>3,&#39;name&#39;=>"T恤",&#39;parId&#39;=>1),
  array(&#39;id&#39;=>4,&#39;name&#39;=>"裤子",&#39;parId&#39;=>1),
  array(&#39;id&#39;=>5,&#39;name&#39;=>"鞋子",&#39;parId&#39;=>1),
  array(&#39;id&#39;=>6,&#39;name&#39;=>"皮鞋",&#39;parId&#39;=>5),
  array(&#39;id&#39;=>7,&#39;name&#39;=>"运动鞋",&#39;parId&#39;=>5),
  array(&#39;id&#39;=>8,&#39;name&#39;=>"耐克",&#39;parId&#39;=>7),
  array(&#39;id&#39;=>9,&#39;name&#39;=>"耐克",&#39;parId&#39;=>3),
  array(&#39;id&#39;=>10,&#39;name&#39;=>"鸿星尔克",&#39;parId&#39;=>7),
  array(&#39;id&#39;=>11,&#39;name&#39;=>"小说",&#39;parId&#39;=>2),
  array(&#39;id&#39;=>12,&#39;name&#39;=>"科幻小说",&#39;parId&#39;=>11),
  array(&#39;id&#39;=>13,&#39;name&#39;=>"古典名著",&#39;parId&#39;=>11),
  array(&#39;id&#39;=>14,&#39;name&#39;=>"文学",&#39;parId&#39;=>2),
  array(&#39;id&#39;=>15,&#39;name&#39;=>"四书五经",&#39;parId&#39;=>14)
);
$html = array();
/**
 * 递归查找父id为$parid的结点
 * @param array $html  按照父-》子的结构存放查找出来的结点
 * @param int $parid  指定的父id
 * @param array $channels  数据数组
 * @param int $dep  遍历的深度,初始化为1
 */
function getChild(&$html,$parid,$channels,$dep){
  /*
   * 遍历数据,查找parId为参数$parid指定的id
   */
  for($i = 0;$i<count($channels);$i++){
    if($channels[$i][&#39;parId&#39;] == $parid){
      $html[] = array(&#39;id&#39;=>$channels[$i][&#39;id&#39;],&#39;name&#39;=>$channels[$i][&#39;name&#39;],&#39;dep&#39;=>$dep);
      getChild($html,$channels[$i][&#39;id&#39;],$channels,$dep+1);
    }
  }
}
getChild($html,0,$channels,1);
?>

This is the core code for recursively implementing infinite column query. You should have a clearer understanding of its implementation process based on Figure 1.

Non-recursive, that is, using the stack mechanism to realize the query of infinite columns

Above we briefly introduced the use of recursion to query infinite columns, below Let’s briefly introduce the non-recursive method. Although recursive functions are not used, in view of the structure page of infinite columns, it is necessary to refer to the recursive implementation mechanism-the stack mechanism to solve this problem.

When I was in school, my teacher said that in fact, the core mechanism of the stack is just four words: first in, last out.

I won’t talk much about the mechanism of the stack here, but I will mainly talk about how to use the stack to implement unlimited column queries.

1. First push the top column into the stack

2. Pop the top element from the stack

3. Store the popped element into the array and mark its depth (the depth is to add 1 to the depth of its parent column)

4. Use the popped element as the parent Column, search for its sub-column

5. Push the found sub-column into the stack and repeat step 2

6. Determine whether the stack is empty If so, the process ends;

By translating the above steps, these steps can be translated into PHP code, and the core code is as follows

<?php
$channels = array(
  array(&#39;id&#39;=>1,&#39;name&#39;=>"衣服",&#39;parId&#39;=>0),
  array(&#39;id&#39;=>2,&#39;name&#39;=>"书籍",&#39;parId&#39;=>0),
  array(&#39;id&#39;=>3,&#39;name&#39;=>"T恤",&#39;parId&#39;=>1),
  array(&#39;id&#39;=>4,&#39;name&#39;=>"裤子",&#39;parId&#39;=>1),
  array(&#39;id&#39;=>5,&#39;name&#39;=>"鞋子",&#39;parId&#39;=>1),
  array(&#39;id&#39;=>6,&#39;name&#39;=>"皮鞋",&#39;parId&#39;=>5),
  array(&#39;id&#39;=>7,&#39;name&#39;=>"运动鞋",&#39;parId&#39;=>5),
  array(&#39;id&#39;=>8,&#39;name&#39;=>"耐克",&#39;parId&#39;=>7),
  array(&#39;id&#39;=>9,&#39;name&#39;=>"耐克",&#39;parId&#39;=>3),
  array(&#39;id&#39;=>10,&#39;name&#39;=>"鸿星尔克",&#39;parId&#39;=>7),
  array(&#39;id&#39;=>11,&#39;name&#39;=>"小说",&#39;parId&#39;=>2),
  array(&#39;id&#39;=>12,&#39;name&#39;=>"科幻小说",&#39;parId&#39;=>11),
  array(&#39;id&#39;=>13,&#39;name&#39;=>"古典名著",&#39;parId&#39;=>11),
  array(&#39;id&#39;=>14,&#39;name&#39;=>"文学",&#39;parId&#39;=>2),
  array(&#39;id&#39;=>15,&#39;name&#39;=>"四书五经",&#39;parId&#39;=>14)
);
$stack = array(); //定义一个空栈
$html = array();  //用来保存各个栏目之间的关系以及该栏目的深度
/*
 * 自定义入栈函数
 */
function pushStack(&$stack,$channel,$dep){
  array_push($stack, array(&#39;channel&#39;=>$channel,&#39;dep&#39;=>$dep));
}
/*
 * 自定义出栈函数
 */
function popStack(&$stack){
  return array_pop($stack);
}
/*
 * 首先将顶级栏目压入栈中
 */
foreach($channels as $key=>$val){
  if($val[&#39;parId&#39;] == 0)
    pushStack($stack,$val,0);
}
/*
 * 将栈中的元素出栈,查找其子栏目
 */
do{
  $par = popStack($stack); //将栈顶元素出栈
  /*
   * 查找以此栏目为父级栏目的id,将这些栏目入栈
   */
  for($i=0;$i<count($channels);$i++){
    if($channels[$i][&#39;parId&#39;] == $par[&#39;channel&#39;][&#39;id&#39;]){
      pushStack($stack,$channels[$i],$par[&#39;dep&#39;]+1);
    }
  }
  /*
   * 将出栈的栏目以及该栏目的深度保存到数组中
   */
  $html[] = array(&#39;id&#39;=>$par[&#39;channel&#39;][&#39;id&#39;],&#39;name&#39;=>$par[&#39;channel&#39;][&#39;name&#39;],&#39;dep&#39;=>$par[&#39;dep&#39;]);
}while(count($stack)>0);

The above is implemented using a non-recursive method.

Download code:https://github.com/onmpw/phpApp

Summary

The above two methods have their own advantages and disadvantages, although the implementation form The above are different, but given the structure of the infinite-level column, the implementation mechanism of both is the same - both are implemented with the help of stack. In real situations, we have to choose a way to implement it based on the needs of the real situation.

Recommended article:

php to realize infinite classification tree

phpHow to realize it Infinite classification tree? This article mainly introduces the method of simple implementation of infinite classification tree list in PHP...

Development process and example analysis of PHP unlimited classification

In our daily life At work, we often encounter many classifications. We know that many open source software’s infinite classifications use recursive algorithms...

The above is the detailed content of Two ways to implement unlimited classification in PHP. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn