Heim  >  Artikel  >  Backend-Entwicklung  >  Implementieren Sie eine unbegrenzte Klassifizierungsabfrage mit PHP

Implementieren Sie eine unbegrenzte Klassifizierungsabfrage mit PHP

不言
不言Original
2018-06-08 17:28:321589Durchsuche

Dieser Artikel ist in zwei Situationen unterteilt. Er stellt die Implementierung der unendlichen Klassifizierung in PHP mit und ohne Rekursion vor.

Ich beschäftige mich schon so lange mit PHP Das Anwendungsmodul des Backend-Managementsystems ist die Klassifizierung von Spalten. Im Allgemeinen müssen die Spalten in unendliche Ebenen unterteilt werden, was bedeutet, dass jede Spalte theoretisch Unterspalten hinzufügen kann. Meiner Meinung nach ist der Umgang mit dieser Situation insgesamt nicht sehr kompliziert. Der einzige relativ schwierige Punkt ist die Abfrage unendlicher Spalten.

Lassen Sie mich Ihnen eine kurze Einführung in diese Situation geben. Es gibt im Allgemeinen zwei Möglichkeiten, diese Art von unendlicher Spalte abzufragen. Eine davon ist die Verwendung des Stapelmechanismus und die andere ist die Verwendung rekursiver Funktionen (natürlich). Der rekursive Funktionsimplementierungsmechanismus wird ebenfalls mithilfe des Stapels implementiert. Wir werden diese beiden Methoden im Folgenden separat vorstellen.

So implementieren Sie rekursive Funktionen

Wie oben erwähnt, werden rekursive Funktionen auch mit Hilfe des Stack-Mechanismus implementiert, die zugrunde liegende Stack-Verarbeitung ist jedoch für Programmierer schwierig. Es ist transparent und Programmierer müssen sich nur um die Implementierungslogik der Anwendung kümmern. Daher ist die Verwendung der Rekursion zur Lösung der oben genannten Probleme einfacher zu verstehen und der Code ist relativ prägnant.

Da eine rekursive Funktion verwendet wird, wissen wir anhand des Namens, dass wir eine benutzerdefinierte Funktion verwenden müssen. Lassen Sie mich zunächst kurz auf die Implementierungsideen eingehen, dann werden wir die spezifischen Details im Code widerspiegeln.

Die Hauptaufgabe der Funktion jeder Ebene besteht darin, die Spalte zu finden, deren übergeordnete ID die aktuelle ID ist. Nachdem Sie sie gefunden haben, rufen Sie die eigene Funktion erneut auf und verwenden Sie die ID der gefundenen Spalte als übergeordnete ID der nächsten Ebene.

Das Flussdiagramm sieht wie folgt aus

Abbildung 1

Ich weiß nicht, ob Sie die obige Erklärung verstehen können, sie tut es Egal, schauen wir uns den Code direkt unten an

<?php
/**
 * 个人博客:迹忆博客
 * 博客地址:www.onmpw.com
 * 递归实现无限极分类
 */
$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);
?>

Dies ist der Kerncode für die rekursive Implementierung einer unendlichen Spaltenabfrage. Sie sollten es klarer haben Verständnis des Implementierungsprozesses anhand von Abbildung 1.

Nicht rekursiv, das heißt, die Abfrage unendlicher Spalten wird mithilfe des Stapelmechanismus realisiert.

Oben haben wir kurz die Verwendung der Rekursion zum Abfragen unendlicher Spalten vorgestellt , wie folgt: Lassen Sie uns kurz die nicht-rekursive Methode vorstellen. Obwohl keine rekursiven Funktionen verwendet werden, ist es angesichts der Strukturseite unendlicher Spalten erforderlich, auf den rekursiven Implementierungsmechanismus – den Stapelmechanismus – zu verweisen, um dieses Problem zu lösen.

Als ich in der Schule war, sagte mein Lehrer, dass der Kernmechanismus eines Stapels eigentlich nur aus vier Wörtern besteht: zuerst rein, zuletzt raus.

Ich werde hier nicht viel über den Mechanismus des Stapels sprechen, sondern hauptsächlich darüber, wie man den Stapel verwendet, um unbegrenzte Spaltenabfragen zu implementieren.

1. Schieben Sie zuerst die oberste Spalte in den Stapel

2. Ziehen Sie das oberste Element aus dem Stapel

3. Speichern Sie das entnommene Element im Array und markieren Sie seine Tiefe (Die Tiefe soll 1 zur Tiefe der übergeordneten Spalte addieren)

4. Nehmen Sie das eingefügte Element als übergeordnete Spalte und suchen Sie nach seiner Unterspalte

5 -Spalte in den Stapel, wiederholen Sie Schritt 2

6. Wenn der Stapel als leer beurteilt wird, endet der Vorgang;

Durch die Übersetzung der obigen Schritte können diese Schritte in PHP-Code übersetzt werden. Der Kerncode lautet wie folgt

<?php
/**
 * 个人博客:迹忆博客
 * 博客地址:www.onmpw.com
*使用非递归,即使用栈的方式实现栏目的无限极分类查询
*/
$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);

Das Obige ist nicht rekursiv implementiert.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Verwenden Sie PHP, um unbegrenzte Baummenüs zu erstellen

Das obige ist der detaillierte Inhalt vonImplementieren Sie eine unbegrenzte Klassifizierungsabfrage mit 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