Zwei Möglichkeiten zur Implementierung einer unbegrenzten Klassifizierung in PHP

韦小宝
Freigeben: 2023-03-19 21:24:01
Original
1691 Leute haben es durchsucht

Dieser Artikel ist in zwei Situationen unterteilt und stellt die Implementierung der unendlichen Klassifizierung in PHP mit und ohne Rekursion vor. Unendliche Klassifizierung ist in unserem Entwicklungsprozess sehr verbreitet, in der wir häufig die unbegrenzte Klassifizierung von PHP verwenden Unsere zukünftige Entwicklung, also sollten wir sie beherrschen. Freunde, die nicht wissen, wie man eine unendliche Klassifizierung in PHP implementiert, können auf diesen Artikel verweisen

Nachdem ich so lange in PHP gearbeitet habe, habe ich festgestellt, dass dies ein unverzichtbares Anwendungsmodul ist Das Backend-Verwaltungssystem ist die Klassifizierung von Spalten. Im Allgemeinen sollten 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, und die andere ist die Verwendung von rekursiv Funktion (natürlich wird der rekursive Funktionsimplementierungsmechanismus auch mit Hilfe 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
$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);
?>
Nach dem Login kopieren

Dies ist der Kerncode für die rekursive Implementierung einer unendlichen Spaltenabfrage. Sie sollten den Implementierungsprozess anhand von Abbildung 1 besser verstehen.

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 Säule auf den Stapel

2. Nehmen Sie das oberste Element vom Stapel

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

4 Übergeordnete Spalte, finden Sie ihre Unterspalte

5. Schieben Sie die gefundene Unterspalte in den Stapel, wiederholen Sie Schritt 2

6 ob der Stapel leer ist. Wenn ja, endet der Prozess.

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

<?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);
Nach dem Login kopieren

Das Obige wird mit einer nicht rekursiven Methode implementiert.

Code herunterladen: https://github.com/onmpw/phpApp

Zusammenfassung

Die beiden oben genannten Methoden haben ihre eigenen Vor- und Nachteile. Obwohl die oben genannten Implementierungsformen unterschiedlich sind, ist der Implementierungsmechanismus beider angesichts der Struktur der Spalte auf unendlicher Ebene derselbe: Beide werden mithilfe des Stapels implementiert. In realen Situationen müssen wir einen Weg zur Umsetzung wählen, der auf den Bedürfnissen der realen Situation basiert.

Empfohlener Artikel:

PHP zur Realisierung eines unendlichen Klassifizierungsbaums

Anleitung in PHP Infinite-Klassifizierungsbaum implementieren? In diesem Artikel wird hauptsächlich die Methode zur einfachen Implementierung einer unendlichen Klassifizierungsbaumliste in PHP vorgestellt...

Der Entwicklungsprozess und die Beispielanalyse der unbegrenzten PHP-Klassifizierung

In unserer täglichen Arbeit Leben Bei der Arbeit stoßen wir oft auf viele Klassifizierungen. Wir wissen, dass die unendlichen Klassifizierungen vieler Open-Source-Software rekursive Algorithmen verwenden ...

Das obige ist der detaillierte Inhalt vonZwei Möglichkeiten zur Implementierung einer unbegrenzten Klassifizierung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!