Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pelaksanaan rekursif klasifikasi tak terhingga dalam PHP

Pelaksanaan rekursif klasifikasi tak terhingga dalam PHP

王林
王林asal
2023-05-07 11:32:072614semak imbas

Dalam pembangunan web, klasifikasi adalah fungsi yang sangat biasa. Dan pengelasan tak terhingga, seperti namanya, adalah mengelas mengikut tahap tak terhingga. Dalam proses interaksi antara bahagian depan dan belakang, kaedah tertentu mesti digunakan untuk mencapai pengelasan ini, dan rekursi PHP adalah salah satu daripadanya.

1. Apakah itu rekursi

Rekursi merujuk kepada teknik memanggil dirinya semasa program dijalankan. Melalui rekursi, masalah kompleks boleh dipermudahkan kepada yang mudah, dengan itu menyelesaikan masalah dengan lebih baik. Untuk menggunakan rekursi dalam PHP, anda perlu menjelaskan dua elemen rekursif: keadaan akhir rekursif dan ungkapan rekursif.

Syarat akhir rekursi merujuk kepada syarat penghakiman apabila rekursi berhenti, yang biasanya merujuk kepada mencapai kedalaman, keadaan atau mempunyai nilai tertentu. Semasa proses rekursif, jika tiada keadaan akhir, program akan jatuh ke dalam gelung tak terhingga.

Ungkapan rekursif merujuk kepada meneruskan operasi rekursif semasa proses rekursif. Biasanya, ungkapan rekursif dilaksanakan di dalam fungsi rekursif dengan memanggil fungsi itu sendiri.

2. Cara menggunakan rekursi untuk mencapai pengelasan tak terhingga

Kita boleh menggunakan rekursi untuk mencapai pengelasan tak terhingga. Secara khusus, kita boleh mentakrifkan fungsi rekursif yang menerima parameter, iaitu tatasusunan yang mewakili senarai klasifikasi pada tahap tertentu. Operasi rekursif dilakukan di dalam fungsi, dan setiap kategori dilalui mengikut giliran Jika kategori ini mempunyai subkategori, subkategori dilalui melalui fungsi rekursif. Pada penghujung traversal, keseluruhan tatasusunan kategori dikembalikan.

Pelaksanaan khusus adalah seperti berikut:

function infiniteCategory($data, $pid = 0, $level = 0)
{
    static $result = array();
    foreach ($data as $key => $value) {
        if ($value['parent_id'] == $pid) {
            $value['level'] = $level;
            $result[] = $value;
            infiniteCategory($data, $value['id'], $level + 1);
        }
    }
    return $result;
}

dianalisis seperti berikut:

(1) Fungsi ini menerima tiga parameter, satu ialah tatasusunan senarai klasifikasi $data, dan yang satu lagi ialah id induk lalai $pid ialah 0, dan satu ialah $level, yang lalai kepada 0.

(2) Tentukan pembolehubah statik untuk menyimpan hasil pengelasan akhir.

(3) Lintas senarai kategori melalui gelung foreach Jika parent_id bagi kategori adalah sama dengan $pid, ini bermakna kategori ini tergolong dalam tahap semasa dan ditambah kepada tatasusunan hasil akhir $result. .

(4) Kemudian panggil fungsi rekursif, masukkan id kategori semasa sebagai $pid, dan $level+1 sebagai tahap tahap pengelasan seterusnya.

(5) Selepas traversal selesai, kembalikan tatasusunan hasil.

Mari kita uji:

$data = array(
    array('id' => 1, 'name' => '电脑', 'parent_id' => 0),
    array('id' => 2, 'name' => '手机', 'parent_id' => 0),
    array('id' => 3, 'name' => '笔记本', 'parent_id' => 1),
    array('id' => 4, 'name' => '台式机', 'parent_id' => 1),
    array('id' => 5, 'name' => '智能手机', 'parent_id' => 2),
    array('id' => 6, 'name' => '非智能手机', 'parent_id' => 2),
    array('id' => 7, 'name' => '微型笔记本', 'parent_id' => 3),
    array('id' => 8, 'name' => '超级台式机', 'parent_id' => 4),
    array('id' => 9, 'name' => '小型台式机', 'parent_id' => 4),
);

var_dump(infiniteCategory($data));

Keputusan yang dijalankan adalah seperti berikut:

array(9) {
  [0]=>
  array(4) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(6) "电脑"
    ["parent_id"]=>
    int(0)
    ["level"]=>
    int(0)
  }
  [1]=>
  array(4) {
    ["id"]=>
    int(3)
    ["name"]=>
    string(9) "笔记本"
    ["parent_id"]=>
    int(1)
    ["level"]=>
    int(1)
  }
  [2]=>
  array(4) {
    ["id"]=>
    int(7)
    ["name"]=>
    string(15) "微型笔记本"
    ["parent_id"]=>
    int(3)
    ["level"]=>
    int(2)
  }
  [3]=>
  array(4) {
    ["id"]=>
    int(4)
    ["name"]=>
    string(9) "台式机"
    ["parent_id"]=>
    int(1)
    ["level"]=>
    int(1)
  }
  [4]=>
  array(4) {
    ["id"]=>
    int(9)
    ["name"]=>
    string(18) "小型台式机"
    ["parent_id"]=>
    int(4)
    ["level"]=>
    int(2)
  }
  [5]=>
  array(4) {
    ["id"]=>
    int(8)
    ["name"]=>
    string(18) "超级台式机"
    ["parent_id"]=>
    int(4)
    ["level"]=>
    int(2)
  }
  [6]=>
  array(4) {
    ["id"]=>
    int(2)
    ["name"]=>
    string(6) "手机"
    ["parent_id"]=>
    int(0)
    ["level"]=>
    int(0)
  }
  [7]=>
  array(4) {
    ["id"]=>
    int(5)
    ["name"]=>
    string(12) "智能手机"
    ["parent_id"]=>
    int(2)
    ["level"]=>
    int(1)
  }
  [8]=>
  array(4) {
    ["id"]=>
    int(6)
    ["name"]=>
    string(15) "非智能手机"
    ["parent_id"]=>
    int(2)
    ["level"]=>
    int(1)
  }
}

Seperti yang anda lihat, senarai klasifikasi telah berjaya ditukar kepada klasifikasi Infinitus, mengikut nilai medan tahap , anda boleh melihat tahap di mana setiap kategori berada.

3. Ringkasan

Kaedah melaksanakan klasifikasi Infinitus melalui rekursi membolehkan kami melengkapkan fungsi klasifikasi dalam pembangunan web dengan cepat dan mempunyai fleksibiliti yang tinggi. Apabila menggunakan rekursi, anda perlu memberi perhatian kepada tetapan keadaan akhir, jika tidak, anda mungkin jatuh ke dalam gelung tak terhingga.

Atas ialah kandungan terperinci Pelaksanaan rekursif klasifikasi tak terhingga dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Perbezaan antara php dan netArtikel seterusnya:Perbezaan antara php dan net