Heim  >  Artikel  >  Backend-Entwicklung  >  Methode zur Realisierung einer unbegrenzten Klassifizierung in PHP+Mysql

Methode zur Realisierung einer unbegrenzten Klassifizierung in PHP+Mysql

coldplay.xixi
coldplay.xixinach vorne
2020-08-15 16:58:453355Durchsuche

Methode zur Realisierung einer unbegrenzten Klassifizierung in PHP+Mysql

Unendliche Klassifizierung ist ein altes Thema, sehen wir uns an, wie man es mit PHP implementiert kombiniert mit MySQL.

【Verwandte Lernempfehlungen: PHP-Programmierung (Video), MySQL-Video-Tutorial]

Erste Methode

Diese Methode ist sehr verbreitet und traditionell.

Tabelle: Kategorie
id int Primärschlüssel, automatische Inkrementierung
Name varchar Kategoriename
pid int Elternklassen-ID, Standard 0
Die Standard-PID der obersten Kategorie ist 0. Wenn wir den Unterkategoriebaum einer bestimmten Kategorie herausnehmen möchten, ist die Grundidee die Rekursion. Aus Effizienzgründen wird natürlich nicht empfohlen, die Datenbank bei jeder Rekursion abzufragen. Der übliche Ansatz besteht darin, zuerst alle abzurufen Kategorien und speichern Sie sie in einem PHP-Array, verarbeiten Sie sie und speichern Sie sie schließlich zwischen, um die Effizienz der nächsten Anfrage zu verbessern.

Erstellen Sie zunächst ein Original-Array, das direkt aus der Datenbank abgerufen werden kann:

Der Code lautet wie folgt:

$categories = array(
    array('id'=>1,'name'=>'电脑','pid'=>0),
    array('id'=>2,'name'=>'手机','pid'=>0),
    array('id'=>3,'name'=>'笔记本','pid'=>1),
    array('id'=>4,'name'=>'台式机','pid'=>1),
    array('id'=>5,'name'=>'智能机','pid'=>2),
    array('id'=>6,'name'=>'功能机','pid'=>2),
    array('id'=>7,'name'=>'超级本','pid'=>3),
    array('id'=>8,'name'=>'游戏本','pid'=>3),
);

Das Ziel besteht darin, ihn in Folgendes umzuwandeln Struktur

Computer
Laptop
Ultrabook
Gaming-Laptop
Desktop
Mobiltelefon
Smartphone
Funktionsfähige Maschine
Wenn Als Array dargestellt, können Sie einen untergeordneten Schlüssel hinzufügen, um seine Unterkategorien zu speichern:

Der Code lautet wie folgt:

array(
    //1对应id,方便直接读取
    1 => array(
        'id'=>1,
        'name'=>'电脑',
        'pid'=>0,
        children=>array(
            &array(
                'id'=>3,
                'name'=>'笔记本',
                'pid'=>1,
                'children'=>array(
                    //此处省略
                )
            ),
            &array(
                'id'=>4,
                'name'=>'台式机',
                'pid'=>1,
                'children'=>array(
                    //此处省略
                )
            ),
        )
    ),
    //其他分类省略
)

Verarbeitungsprozess:

Der Code lautet wie folgt :

$tree = array();
//第一步,将分类id作为数组key,并创建children单元
foreach($categories as $category){
    $tree[$category['id']] = $category;
    $tree[$category['id']]['children'] = array();
}
//第二部,利用引用,将每个分类添加到父类children数组中,这样一次遍历即可形成树形结构。
foreach ($tree as $k=>$item) {
    if ($item['pid'] != 0) {
        $tree[$item['pid']]['children'][] = &$tree[$k];
    }
}
print_r($tree);

Das Druckergebnis ist wie folgt:

Der Code lautet wie folgt:

Array
(
    [1] => Array
        (
            [id] => 1
            [name] => 电脑
            [pid] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 3
                            [name] => 笔记本
                            [pid] => 1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 7
                                            [name] => 超级本
                                            [pid] => 3
                                            [children] => Array
                                                (
                                                )
                                        )
                                    [1] => Array
                                        (
                                            [id] => 8
                                            [name] => 游戏本
                                            [pid] => 3
                                            [children] => Array
                                                (
                                                )
                                        )
                                )
                        )
                    [1] => Array
                        (
                            [id] => 4
                            [name] => 台式机
                            [pid] => 1
                            [children] => Array
                                (
                                )
                        )
                )
        )
    [2] => Array
        (
            [id] => 2
            [name] => 手机
            [pid] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 5
                            [name] => 智能机
                            [pid] => 2
                            [children] => Array
                                (
                                )
                        )
                    [1] => Array
                        (
                            [id] => 6
                            [name] => 功能机
                            [pid] => 2
                            [children] => Array
                                (
                                )
                        )
                )
        )
    [3] => Array
        (
            [id] => 3
            [name] => 笔记本
            [pid] => 1
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 7
                            [name] => 超级本
                            [pid] => 3
                            [children] => Array
                                (
                                )
                        )
                    [1] => Array
                        (
                            [id] => 8
                            [name] => 游戏本
                            [pid] => 3
                            [children] => Array
                                (
                                )
                        )
                )
        )
    [4] => Array
        (
            [id] => 4
            [name] => 台式机
            [pid] => 1
            [children] => Array
                (
                )
        )
    [5] => Array
        (
            [id] => 5
            [name] => 智能机
            [pid] => 2
            [children] => Array
                (
                )
        )
    [6] => Array
        (
            [id] => 6
            [name] => 功能机
            [pid] => 2
            [children] => Array
                (
                )
        )
    [7] => Array
        (
            [id] => 7
            [name] => 超级本
            [pid] => 3
            [children] => Array
                (
                )
        )
    [8] => Array
        (
            [id] => 8
            [name] => 游戏本
            [pid] => 3
            [children] => Array
                (
                )
        )
)

Vorteile: Die Beziehung ist klar und einfach die Beziehung zwischen Vorgesetzten und Untergebenen zu ändern.

Nachteile: Bei Verwendung von PHP zur Verarbeitung wird auch die Effizienz verringert, wenn die Anzahl der Kategorien sehr groß ist.

Die zweite Methode

Diese Methode besteht darin, dem Tabellenfeld ein Pfadfeld hinzuzufügen:

Table:category
id int Primary Key, Automatisch inkrementieren
Name varchar Klassifizierungsname
pid int übergeordnete Klassen-ID, Standard 0
Pfad varchar Pfad
Beispieldaten:

ID-Name Name PID PID-Pfad
1 Computer 0 0
2 Mobiltelefon 0 0
3 Notebook 1 0-1
4 Ultrabook 3 0-1-3
5 Spielebuch 3 0-1-3
path zeichnet den Pfad von der Stammkategorie zur oberen übergeordneten Kategorie auf, dargestellt durch id+'-'.

Angenommen, wir möchten alle untergeordneten Kategorien unter dem Computer abfragen, benötigen wir auf diese Weise nur eine SQL-Anweisung:

Wählen Sie ID, Name, Pfad aus der Kategorie aus, wobei der Pfad wie (wählen Sie concat(Pfad, '- ',id,'%') als Pfad von der Kategorie, wo id=1);
Ergebnis:

+----+-----------+- -- ----+
|. id |.
+----+-------+
|. 0-1 |
| 0-1-3 |. - +-----------+-------+
Diese Methode wurde auch von vielen Menschen übernommen. Ich habe sie unten zusammengefasst:

Vorteile: einfach durchzuführen Abfrage, hohe Effizienz, das Pfadfeld kann indiziert werden.

Nachteile: Das Aktualisieren von Knotenbeziehungen ist mühsam und erfordert die Aktualisierung der Pfadfelder aller Nachkommen.

Das Obige ist der gesamte Inhalt dieses Artikels. Zwei Methoden, welche bevorzugen Sie? Ich hoffe, es gefällt euch allen.

Verwandte Empfehlungen: Programmiervideokurs

Das obige ist der detaillierte Inhalt vonMethode zur Realisierung einer unbegrenzten Klassifizierung in PHP+Mysql. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen