Jadual Kandungan
Memahami data input
Langkah 1: Item Peta oleh ID
Langkah 2: Lampirkan anak kepada ibu bapa
Langkah 3: struktur pokok yang dihasilkan
Pilihan: Fungsi rekursif untuk membina pokok (alternatif)
Mata utama
Rumah pembangunan bahagian belakang tutorial php Membina struktur pokok rekursif dengan tatasusunan bersekutu php

Membina struktur pokok rekursif dengan tatasusunan bersekutu php

Aug 04, 2025 pm 12:52 PM
PHP Associative Arrays

Untuk membina data rata ke dalam struktur pokok rekursif, anda perlu menggunakan array bersekutu untuk memetakan nod dengan cekap; 1. Melalui data untuk membuat array bersekutu dengan ID sebagai kunci, dan setiap nod memulakan anak kosong; 2. Traverse lagi, tambahkan rujukan nod semasa ke array kanak -kanak nod induk melalui parent_id, dan letakkan nod akar ke dalam array pokok; 3. Akhirnya, struktur pokok bersarang diperolehi, dan kerumitan masa kaedah ini hampir dengan O (n), yang lebih baik daripada skema rekursif, dan sesuai untuk senario hierarki seperti klasifikasi dan komen.

Membina struktur pokok rekursif dengan tatasusunan bersekutu php

Apabila bekerja dengan data hierarki dalam kategori seperti PHP, komen, atau struktur organisasi -anda sering perlu membina struktur pokok rekursif dari data rata. Arus bersekutu di PHP adalah sempurna untuk tugas ini kerana mereka membolehkan anda memetakan ID ke nod dan sarang kanak -kanak yang cekap di bawah ibu bapa mereka.

Membina struktur pokok rekursif dengan tatasusunan bersekutu php

Berikut adalah cara menukar senarai rata (contohnya, dari pangkalan data) ke dalam pokok bersarang menggunakan logik rekursif dan array yang berkaitan.


Memahami data input

Anggapkan anda mempunyai pelbagai item, masing -masing dengan id , parent_id , dan beberapa data :

Membina struktur pokok rekursif dengan tatasusunan bersekutu php
 $ flatData = [
    ['id' => 1, 'parent_id' => null, 'name' => 'elektronik'],
    ['id' => 2, 'parent_id' => 1, 'name' => 'telefon bimbit'],
    ['id' => 3, 'parent_id' => 1, 'name' => 'komputer riba'],
    ['id' => 4, 'parent_id' => 2, 'nama' => 'telefon pintar'],
    ['id' => 5, 'parent_id' => 4, 'name' => 'android'],
    ['id' => 6, 'parent_id' => 4, 'name' => 'ios'],
];

Matlamat kami adalah untuk menjadikannya menjadi pokok bersarang di mana setiap nod mengandungi anak -anaknya.


Langkah 1: Item Peta oleh ID

Pertama, bina array yang berkaitan di mana setiap id menunjuk ke data penuhnya, dan tambahkan array children kosong kepada setiap:

Membina struktur pokok rekursif dengan tatasusunan bersekutu php
 $ item = [];
foreach ($ flatData sebagai $ item) {
    $ item ['kanak -kanak'] = [];
    $ item [$ item ['id']] = $ item;
}

Ini memberi kita akses cepat ke mana -mana nod oleh ID.


Langkah 2: Lampirkan anak kepada ibu bapa

Gelung melalui item dan lampirkan setiap item ke ibu bapa menggunakan parent_id . Jika parent_id wujud, tolak item ke dalam array children ibu bapa. Item akar (dengan ibu bapa null ) akan kekal peringkat tertinggi.

 $ pokok = [];

foreach ($ item sebagai $ id => & $ item) {
    $ parentid = $ item ['parent_id'];
    jika ($ parentid === null) {
        $ pokok [] = & $ item;
    } else {
        jika (isset ($ item [$ parentId])) {
            $ item [$ parentid] ['kanak -kanak'] [] = & $ item;
        }
    }
}
unset ($ item); // Rujukan Break

Kami menggunakan rujukan ( & ) untuk memastikan perubahan menyebarkan dengan betul.


Langkah 3: struktur pokok yang dihasilkan

Sekarang $tree mengandungi nod akar, masing -masing dengan kanak -kanak bersarang rekursif:

 print_r ($ pokok);

Output (dipermudahkan):

 Array
(
    [0] => Array
        (
            [id] => 1
            [parent_id] => 
            [Nama] => Elektronik
            [kanak -kanak] => array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [parent_id] => 1
                            [Nama] => Telefon bimbit
                            [kanak -kanak] => array
                                (
                                    [0] => Array
                                        (
                                            [id] => 4
                                            [parent_id] => 2
                                            [nama] => telefon pintar
                                            [kanak -kanak] => array
                                                (
                                                    [0] => Array
                                                        (
                                                            [id] => 5
                                                            [parent_id] => 4
                                                            [nama] => Android
                                                            [kanak -kanak] => array ()
                                                        )
                                                    [1] => array
                                                        (
                                                            [id] => 6
                                                            [parent_id] => 4
                                                            [nama] => iOS
                                                            [kanak -kanak] => array ()
                                                        )
                                                )
                                        )
                                )
                        )
                    [1] => array
                        (
                            [id] => 3
                            [parent_id] => 1
                            [nama] => komputer riba
                            [kanak -kanak] => array ()
                        )
                )
        )
)

Pilihan: Fungsi rekursif untuk membina pokok (alternatif)

Anda juga boleh menggunakan rekursi untuk membina pokok itu, walaupun ia kurang efisien untuk dataset besar:

 Fungsi BuildTree ($ item, $ parentId = null) {
    $ cawangan = [];
    foreach ($ item sebagai $ item) {
        jika ($ item ['parent_id'] == $ parentid) {
            $ kanak -kanak = BuildTree ($ item, $ item ['id']);
            jika ($ kanak -kanak) {
                $ item ['kanak -kanak'] = $ kanak -kanak;
            }
            $ cawangan [] = $ item;
        }
    }
    kembali $ cawangan;
}

$ pokok = BuildTree ($ flatData);

Versi ini mengelakkan rujukan tetapi mempunyai kerumitan masa O (n²) dalam kes yang paling teruk. Kaedah pemetaan array yang berkaitan lebih berskala.


Mata utama

  • Gunakan tatasusunan yang berkaitan untuk memetakan id => node untuk o (1) penampilan.
  • Bina pokok secara berulang dengan melampirkan anak -anak kepada ibu bapa melalui rujukan.
  • Elakkan pengimbasan berulang dengan memanfaatkan hubungan ibu bapa dan kanak-kanak.
  • Berhati -hati dengan rujukan dalam PHP -selalu unset selepas gelung dengan rujukan.

Corak ini digunakan secara meluas dalam sistem CMS, kategori e-dagang, benang komen, dan struktur direktori fail.

Pada asasnya, ia tidak kompleks -tetapi menggunakan array yang berkaitan dengan bijak menjadikannya cepat dan bersih.

Atas ialah kandungan terperinci Membina struktur pokok rekursif dengan tatasusunan bersekutu php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Skop pembolehubah PHP dijelaskan
1 bulan yang lalu By 百草
Mengulas kod dalam php
1 bulan yang lalu By 百草
Petua untuk menulis komen php
1 bulan yang lalu By 百草

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1510
276
Mengoptimumkan jejak memori untuk array bersekutu berskala besar Mengoptimumkan jejak memori untuk array bersekutu berskala besar Aug 03, 2025 pm 03:30 PM

ToreducememoryusageinlargeassociativearRays, firstChooseaCompactDatastructureLikeFlat_Hash_MaporperfectHashFashforstaticData, thenoptimizeKeyandvalueRepresentationsbyusingsmallerTypes, Interningstrings,

Paradigma pengaturcaraan fungsional dengan array bersekutu PHP Paradigma pengaturcaraan fungsional dengan array bersekutu PHP Aug 03, 2025 pm 04:18 PM

Useimmutablearraysbyreturningnewarraysinsteadofmodifyingoriginals;2.Applyhigher-orderfunctionslikearray_map,array_filter,andarray_reduceforcleantransformations;3.ChainoperationsusingnestedcallsoraCollectionclasstocreatefunctionalpipelines;4.Writepure

Melaksanakan Struktur Data Set dan Kamus dengan Array Bersekutu PHP Melaksanakan Struktur Data Set dan Kamus dengan Array Bersekutu PHP Aug 06, 2025 am 01:02 AM

PhassociativearrayscanbeusedToImplementSetandDictionaryDatastructures.1.foraset, UseArrayKeyStoreUniqueelements, membolehkan (1) purata-timecomplexityforadd, mengalih keluar, dan lookoperationsviaisset ()

Beyond `foreach`: Menguasai lelaran dengan iterators dan` array_walk` Beyond `foreach`: Menguasai lelaran dengan iterators dan` array_walk` Aug 05, 2025 am 08:07 AM

Menggunakan iterators (seperti kelas yang melaksanakan antara muka iterator) dapat memproses set data yang besar untuk mengelakkan sisa memori; 2. Array_walk sesuai untuk senario di mana array asal diubahsuai secara langsung, dan menyokong unsur -unsur operasi dan kunci akses dengan rujukan; 3. Tidak seperti array_map, array_walk tidak menghasilkan array baru, yang sesuai untuk penukaran di tapak; 4. Ia boleh menggabungkannya dengan iterators dan fungsi panggil balik untuk membina logik pemprosesan data yang boleh diguna semula dan boleh dikomposisikan; 5. Foreach masih sesuai untuk gelung mudah, tetapi iterators atau array_walk harus digunakan dalam senario kompleks untuk meningkatkan kecekapan dan kualiti kod. Menguasai teknologi ini boleh mencapai traversal dan penukaran data PHP yang lebih cekap dan fleksibel.

Mengubah struktur data: `array_column` vs` array_map` untuk array bersekutu Mengubah struktur data: `array_column` vs` array_map` untuk array bersekutu Aug 05, 2025 pm 05:42 PM

Array_Column sesuai untuk mengekstrak nilai lajur tunggal atau membuat peta nilai utama, manakala array_map sesuai untuk penukaran data yang kompleks; 1. Apabila hanya satu bidang seperti nama dan ID diperlukan, ia lebih ringkas dan cekap untuk menggunakan array_column; 2. Apabila perlu untuk menggabungkan medan, tambahkan logik atau membina struktur baru, gunakan array_map untuk memberikan kawalan penuh; 3. Array_column mempunyai prestasi yang lebih tinggi dan menyokong parameter ketiga sebagai indeks utama; 4. Array_map boleh mengendalikan pelbagai tatasusunan dan logik bersyarat, tetapi mempunyai overhead yang tinggi; 5. Kedua -duanya boleh digunakan dalam kombinasi, seperti mengekstrak terlebih dahulu dengan array_column dan kemudian memproses dengan array_map.

Menganalisis kerumitan masa operasi utama dalam tatasusunan bersekutu PHP Menganalisis kerumitan masa operasi utama dalam tatasusunan bersekutu PHP Aug 04, 2025 am 08:29 AM

PhassociativearRaySareImplementedAsorderedHashtables, enablingefficientkey-nilai-nilai;

Strategi Serialization JSON Berkesan untuk Array Bersekutu Multidimensial Strategi Serialization JSON Berkesan untuk Array Bersekutu Multidimensial Aug 03, 2025 am 11:50 AM

NormalizethedataStructureBereserializationToensureSistencyAndoidAdAbiguityInjsonOutput.2.handlenon-serasizableDatyPesByRecursifyFilteringingingingingingCalarSandusingJSonserializableForCustomobject.3.useSJSONSTONS

Menggabungkan Array Array: `Array_merge` vs Operator Kesatuan () Menggabungkan Array Array: `Array_merge` vs Operator Kesatuan () Aug 06, 2025 pm 06:24 PM

array_merge () dan pengendali berkelakuan berbeza dalam kombinasi php: 1.array_merge () akan menindih semula kunci angka dan menimpa kunci rentetan, dan nilai berikutnya akan disukai; 2. Pengendali mengekalkan nilai utama array kiri, dan hanya akan ditambah apabila kunci yang betul tidak wujud, dan nilai kiri akan disukai; 3.Array_merge () sesuai untuk menambahkan data atau mengkonfigurasi ganti rugi, dan sesuai untuk menetapkan nilai lalai; 4. Kedua -duanya tidak menyokong penggabungan bersarang yang mendalam, dan logik rekursif tersuai diperlukan; Oleh itu, mengikut niat, pilih: array_merge () perlu diindeks semula, dan nilai utama asal mesti disimpan tidak ditimpa.

See all articles