Jadual Kandungan
Memahami struktur pokok pilihan produk
Soalan: Bina pokok pilihan dari data rata
Penyelesaian: Pembinaan berulang dan traversal rujukan
1. Sediakan struktur pemetaan tambahan
2. Bangunlah secara beransur -ansur membina pokok pilihan
Kod sampel lengkap
Nota dan ringkasan
Rumah pembangunan bahagian belakang tutorial php Bina Pilihan Produk secara dinamik: Dari data rata ke struktur bersarang

Bina Pilihan Produk secara dinamik: Dari data rata ke struktur bersarang

Oct 07, 2025 pm 01:45 PM

Bina Pilihan Produk secara dinamik: Dari data rata ke struktur bersarang

Tutorial ini memperincikan bagaimana untuk menukar senarai pemilihan variasi produk yang diratakan ke dalam struktur pokok pilihan bersarang. Melalui contoh PHP, kami menunjukkan bagaimana untuk membina pelbagai pelbagai lapisan menggunakan pemetaan tambahan dan traversal rujukan, di mana setiap peringkat mewakili pilihan produk, dan nod daun akhir menyimpan ID produk yang sepadan, dengan itu menguruskan dan memaparkan konfigurasi produk yang kompleks.

Memahami struktur pokok pilihan produk

Dalam e-dagang atau sistem konfigurasi produk, produk sering mempunyai pelbagai varian pilihan, seperti warna, saiz, jenama, dan lain-lain untuk mewakili hubungan antara kombinasi variasi dan produk akhir, cara yang biasa dan intuitif adalah menggunakan struktur pokok pilihan.

Pokok pilihan biasa adalah pelbagai lapisan bersarang yang kedalamannya sesuai dengan bilangan pilihan produk. Sebagai contoh, jika produk mempunyai tiga pilihan: warna, saiz, dan jenama, maka kedalaman pokok pilihan adalah tiga lapisan. Setiap tahap pokok mewakili pilihan tertentu (contohnya, lapisan pertama adalah warna, lapisan kedua adalah saiz, dan lapisan ketiga adalah jenama), dan indeks array sepadan dengan nilai tertentu pilihan. Melangkah ke tahap paling rendah pokok dan akhirnya anda akan mendapat ID produk yang sepadan dengan semua kombinasi pemilihan. A 0 atau nilai null dalam pokok biasanya bermaksud tidak ada produk yang sepadan di bawah jalan, iaitu, "akhir mati".

Contoh struktur pokok pilihan:

 "OpsyenTree": [
        [
            0, // Warna yang sepadan: Merah, Saiz: Kecil, Jenama: (Tiada)
            0, // Warna yang sepadan: Merah, Saiz: Sederhana, Jenama: (Tiada)
            [
                820, // Warna yang sepadan: Merah, Saiz: Besar, Jenama: Brandx
                0 // Warna yang sepadan: Merah, Saiz: Besar, Jenama: Brandy (Tiada)
            ]
        ],
        [
            0, // Warna yang sepadan: Hijau, Saiz: Kecil, Jenama: (Tiada)
            [
                0, // Warna yang sepadan: Hijau, Saiz: Sederhana, Jenama: Brandx (Tiada)
                821 // Warna yang sepadan: Hijau, Saiz: Sederhana, Jenama: Brandy
            ],
            [
                823, // Warna yang sepadan: Hijau, Saiz: Besar, Jenama: Brandx
                0 // Warna yang sepadan: Hijau, Saiz: Besar, Jenama: Brandy (Tiada)
            ]
        ],
        [
            [
                824, // Warna yang sepadan: Biru, Saiz: Kecil, Jenama: Brandx
                825 // Warna yang sepadan: Biru, Saiz: Kecil, Jenama: Brandy
            ],
            0, // Warna yang sepadan: Biru, Saiz: Sederhana, Jenama: (Tiada)
            0 // Warna yang sepadan: Biru, Saiz: Besar, Jenama: (Tiada)
        ]
    ]

Dalam contoh ini, indeks array paling luar mungkin mewakili warna yang berbeza (contohnya, indeks 0 mewakili merah, indeks 1 mewakili hijau, dan indeks 2 mewakili biru). Indeks array lapisan kedua mewakili saiz (contohnya, indeks 0 mewakili kecil, indeks 1 mewakili medium, indeks 2 mewakili besar), dan sebagainya. Nombor akhir (seperti 820) adalah ID produk yang sepadan dengan gabungan tertentu.

Soalan: Bina pokok pilihan dari data rata

Katakan kami mempunyai senarai produk yang rata, masing -masing mengandungi gabungan pemilihannya (seperti warna, saiz, jenama) dan ID produk yang sepadan:

 $ produk_to_add = [
    [
        "Pilihan" => ['Red', 'Medium', 'Brandx'],
        "Product_id" => 820
    ],
    [
        "Pilihan" => ['merah', 'kecil', 'brendi'],
        "Product_id" => 821
    ],
    [
        "Pilihan" => ['Hijau', 'Kecil', 'Brandx'],
        "Product_id" => 822
    ],
    [
        "Pilihan" => ['Blue', 'Large', 'Brandy'],
        "Product_id" => 823
    ],
];

Matlamat kami adalah untuk menukar senarai rata ini ke dalam struktur "optiontree" bersarang yang diterangkan di atas.

Penyelesaian: Pembinaan berulang dan traversal rujukan

Kunci untuk membina pokok pilihan adalah cara memetakan nilai pilihan dalam bentuk rentetan (seperti "merah") ke indeks berangka array dan bagaimana untuk membuat atau mengisi cawangan yang sama dari pokok yang berulang melalui setiap produk.

1. Sediakan struktur pemetaan tambahan

Pertama, kita perlu membuat peta untuk setiap jenis pilihan (warna, saiz, jenama) untuk menukar nama pilihan tertentu ke dalam indeksnya dalam array. Ini dapat dicapai dengan mudah melalui fungsi array_flip, yang menukar pasangan nilai utama array.

 // Tentukan semua pilihan yang mungkin dan pesanan mereka $ all_colors = ["merah", "hijau", "biru"];
$ all_sizes = ["kecil", "medium", "besar"];
$ all_brands = ["brandx", "brandy"];

// Buat peta tambahan: nama pilihan => indeks array $ props = [
    array_flip ($ all_colors), // peta pilihan warna array_flip ($ all_sizes), // peta pilihan saiz array_flip ($ all_brands) // peta pilihan jenama];

Arahan prop $ kini mengandungi nama untuk indeks pemetaan untuk setiap tahap pilihan. Sebagai contoh, $ props [0] ['merah'] akan kembali 0 dan $ props [1] ['medium'] akan kembali 1.

2. Bangunlah secara beransur -ansur membina pokok pilihan

Seterusnya, kami akan melangkah ke atas setiap produk dalam $ Products_to_add dan masukkan maklumatnya ke $ optionTree. Kunci untuk menggunakan ciri rujukan PHP (= &) di sini adalah bahawa ia membolehkan kita membuat penunjuk ke unsur -unsur di dalam array, supaya kita boleh mengubah secara langsung kedudukan yang sama apabila melintasi dan membina pokok.

 $ optionTree = null; // Inisialisasi Pilihan Pilihan Kosong Foreach ($ Products_to_add sebagai $ produk) {
    $ node = & $ optionTree; // Inisialisasi $ nod sebagai rujukan kepada $ optionTree // Traverse setiap pemilihan produk semasa ($ produk ["pilihan"] sebagai $ depth => $ name) {
        // Jika nod semasa adalah null, ini bermakna ini adalah cawangan baru dan perlu dimulakan sebagai array yang diisi dengan null // saiz array bergantung kepada bilangan semua pilihan yang mungkin pada tahap semasa jika ($ nod === null) {
            $ node = array_fill (0, kiraan ($ props [$ kedalaman]), null);
        }

        // Dapatkan indeksnya dalam array hierarki semasa berdasarkan nama pilihan $ index = $ props [$ kedalaman] [$ name];

        // gerakkan rujukan $ nod ke tahap seterusnya pokok $ node = & $ node [$ index];
    }

    // Selepas melintasi semua pilihan, node $ semasa menunjuk ke lokasi nod daun akhir // Berikan ID produk ke lokasi ini $ node = $ produk ["product_id"];
}

// Unreference untuk mengelakkan unset ($ node);

Penjelasan kod:

  • $ optionTree = null;: Pada permulaan, seluruh pokok pilihan kosong.
  • $ node = & $ optionTree ;: $ node ditetapkan untuk merujuk kepada keseluruhan $ optionTree setiap kali produk baru diproses. Ini bermakna bahawa sebarang pengubahsuaian kepada $ node akan ditunjukkan secara langsung pada $ optionTree.
  • Foreach ($ produk ["Pilihan"] sebagai $ DEPTH => $ nama): Loop ini melalui semua pilihan produk semasa. $ kedalaman menunjukkan pilihan mana yang sedang dipilih (contohnya, 0 mewakili warna dan 1 mewakili saiz), dan nama $ adalah nilai pemilihan tertentu (contohnya, "merah").
  • jika ($ node === null): Ini adalah langkah utama. Jika nod $ semasa yang menunjuk adalah batal (iaitu, laluan cawangan ini diakses untuk kali pertama), kita perlu membuat array baru untuk menampung pilihan pada tahap semasa. array_fill (0, kiraan ($ props [$ kedalaman]), null) mencipta pelbagai saiz yang ditentukan (ditentukan oleh jumlah tahap pilihan semasa) dan mengisi NULL.
  • $ indeks = $ props [$ kedalaman] [$ name];
  • $ node = & $ node [$ index];: Ini adalah teras rujukan traversal. Rujukan kepada $ nod dikemas kini untuk menunjuk kepada kedudukan indeks yang sepadan dalam array hierarki semasa. Dengan cara ini, dalam gelung seterusnya, $ nod akan menunjuk ke lapisan pokok yang lebih dalam.
  • $ node = $ Product ["product_id"];: Apabila gelung dalaman berakhir, $ node titik ke lokasi nod daun di pokok pilihan yang betul -betul sepadan dengan semua kombinasi pemilihan produk semasa. Pada masa ini, kami menetapkan produk_id produk ke kedudukan ini.
  • Unset ($ nod);: Ini adalah tabiat pengaturcaraan yang baik. Selepas rujukan digunakan, dereference boleh menghalang $ nod dari secara tidak sengaja mengubahsuai $ optionTree dalam kod berikutnya.

Kod sampel lengkap

Menggabungkan dua bahagian kod di atas boleh mendapatkan penyelesaian lengkap:

  Php

// 1. Tentukan semua pilihan yang mungkin dan pesanan mereka $ all_colors = ["merah", "hijau", "biru"];
$ all_sizes = ["kecil", "medium", "besar"];
$ all_brands = ["brandx", "brandy"];

// 2. Buat peta sekunder: nama pilihan => indeks array $ props = [
    array_flip ($ all_colors), // peta pilihan warna array_flip ($ all_sizes), // peta pilihan saiz array_flip ($ all_brands) // peta pilihan jenama];

// 3. Menunggu data produk rata $ produk_to_add = [
    [
        "Pilihan" => ['Red', 'Medium', 'Brandx'],
        "Product_id" => 820
    ],
    [
        "Pilihan" => ['merah', 'kecil', 'brendi'],
        "Product_id" => 821
    ],
    [
        "Pilihan" => ['Hijau', 'Kecil', 'Brandx'],
        "Product_id" => 822
    ],
    [
        "Pilihan" => ['Blue', 'Large', 'Brandy'],
        "Product_id" => 823
    ],
];

// 4. Inisialisasi pokok pilihan kosong $ optionTree = null;

// 5. Bina secara beransur -ansur membina pokok pilihan ($ produk_to_add sebagai produk $) {
    $ node = & $ optionTree; // Inisialisasi $ nod sebagai rujukan kepada $ optionTree // Traverse setiap pemilihan produk semasa ($ produk ["pilihan"] sebagai $ depth => $ name) {
        // Jika nod semasa adalah null, ini bermakna ini adalah cawangan baru dan perlu dimulakan sebagai array yang diisi dengan null // saiz array bergantung kepada bilangan semua pilihan yang mungkin pada tahap semasa jika ($ nod === null) {
            // pastikan $ props [$ kedalaman] wujud untuk mengelakkan kesilapan yang disebabkan oleh konfigurasi yang tidak betul jika (! Isset ($ props [$ kedalaman])) {
                Buang pengecualian baru ("Konfigurasi yang hilang untuk kedalaman pilihan:". $ kedalaman);
            }
            $ node = array_fill (0, kiraan ($ props [$ kedalaman]), null);
        }

        // pastikan nama pilihan wujud dalam peta jika (! Isset ($ props [$ kedalaman] [$ name])) {
            // Anda boleh memilih untuk membuang ralat atau melangkau produk ini, bergantung kepada logik perniagaan echo "Amaran: Opsyen '{$ Name}' tidak dijumpai untuk kedalaman {$ kedalaman}. $ produk ["product_id"]. "\ n";
            // Pertimbangkan bagaimana menangani keadaan ini, seperti menetapkan $ nod untuk batal dan memecahkan gelung dalaman $ nod = null; 
            rehat; // keluar dari kitaran pemilihan produk semasa}

        // Dapatkan indeksnya dalam array hierarki semasa berdasarkan nama pilihan $ index = $ props [$ kedalaman] [$ name];

        // gerakkan rujukan $ nod ke tahap seterusnya pokok $ node = & $ node [$ index];
    }

    // Berikan jika ($ node! == null) {
        // Selepas melintasi semua pilihan, node $ semasa menunjuk ke lokasi nod daun akhir // Berikan ID produk ke lokasi ini $ node = $ produk ["product_id"];
    }
}

// 6. Dereference untuk mengelakkan unset ($ nod) daripada diubahsuai secara tidak sengaja;

// 7. Output pokok pilihan yang dihasilkan echo "";
print_r ($ optionTree);
echo "
"; ?>

Hasil output (sebahagiannya, dipermudahkan untuk kebolehbacaan):

 Array
(
    [0] => array // warna yang sepadan: merah
        (
            [0] => Array // Saiz yang sepadan: Kecil
                (
                    [0] => NULL
                    [1] => 821 // Jenama: Brandy
                )

            [1] => Array // Saiz yang sepadan: Sederhana
                (
                    [0] => 820 // Brand: Brandx
                    [1] => NULL
                )

            [2] => null // Saiz yang sepadan: besar (tiada produk yang sepadan)
        )

    [1] => array // warna yang sepadan: hijau
        (
            [0] => Array // Saiz yang sepadan: Kecil
                (
                    [0] => 822 // Brand: Brandx
                    [1] => NULL
                )
            // ... pilihan lain yang berkaitan dengan hijau)
    // ... pilihan lain yang berkaitan dengan biru)

Nota dan ringkasan

  1. Kepentingan kutipan (&): Memahami petikan dalam PHP adalah kunci untuk melaksanakan kaedah membina dinamik ini. Ia membolehkan kita memanipulasi struktur dalaman $ optionTree secara langsung, dan bukannya membuat salinan. Selepas digunakan, pastikan anda tidak jelas ($ nod).
  2. NULL DAN 0 PEMILIHAN: Dalam pokok pilihan, kedua -dua null dan 0 boleh mewakili "mati akhir" atau tiada produk yang sepadan. Menggunakan null biasanya lebih jelas kerana ia konsisten dengan semantik pembolehubah yang tidak jelas atau nilai null dalam PHP.
  3. Peraturan Pesanan Pilihan: Array_FLIP bergantung pada susunan array pilihan asal. Dalam aplikasi praktikal, pastikan susunan tatasusunan seperti $ all_colors, $ all_sizes, dan lain -lain adalah tetap dan meliputi semua pilihan yang mungkin, jika tidak, ia boleh menyebabkan kekeliruan indeks atau pilihan yang sepadan tidak dapat dijumpai.
  4. Nombor Pilihan Variabel: Kaedah ini membolehkan fleksibiliti dalam mengendalikan pokok pilihan pada kedalaman yang berbeza. Selagi array $ props dikonfigurasi dengan betul dengan pemetaan di semua peringkat, kod akan berfungsi dengan betul tidak kira berapa banyak pilihan yang ada.
  5. Pengendalian ralat: Dalam persekitaran pengeluaran sebenar, cek untuk $ props [$ kedalaman] dan $ props [$ kedalaman] [$ nama] harus ditambah untuk mengendalikan situasi apabila data produk mengandungi nilai pilihan yang tidak ditakrifkan dalam $ props, seperti membuang pengecualian atau merakam amaran.
  6. Pertimbangan Prestasi: Kaedah pembinaan berulang ini biasanya lebih cekap untuk set data produk yang sangat besar kerana ia mengelakkan overhead rekursi. Walau bagaimanapun, jika bilangan pilihan dan nilai setiap pilihan adalah sangat besar, array_fill boleh membuat array yang sangat besar, dengan perhatian kepada penggunaan ingatan.

Melalui kaedah di atas, kami dapat dengan cekap dan dinamik menukar senarai pemilihan variasi produk rata ke dalam pokok pilihan bersarang dengan struktur yang jelas, mudah untuk menanyakan dan mengurus, menyediakan asas data pepejal untuk konfigurasi produk dan keupayaan penapisan.

Atas ialah kandungan terperinci Bina Pilihan Produk secara dinamik: Dari data rata ke struktur bersarang. 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.

Stock Market GPT

Stock Market GPT

Penyelidikan pelaburan dikuasakan AI untuk keputusan yang lebih bijak

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

Bagaimana cara memeriksa sama ada alamat e -mel sah dalam php? Bagaimana cara memeriksa sama ada alamat e -mel sah dalam php? Sep 21, 2025 am 04:07 AM

UseFilter_var () TOVALIDATEMailSyntaxandCheckDnsrr () TOVERIFYDOnMAINMXRECORDS.example: $ e -mel = "user@example.com"; if (filter_var ($ e -mel, filter_email) && checkDnsrr (expode '

Bagaimana membuat salinan atau klon objek yang mendalam dalam php? Bagaimana membuat salinan atau klon objek yang mendalam dalam php? Sep 21, 2025 am 12:30 AM

UseUnserialize (Serialize ($ obj)) fordeepcopyingWhenallDataisserizable; jika tidak, pelaksanaan__clone () tomanuallyduplicatenestedObjectsandavoidsharedReferences.

Bagaimana untuk menggabungkan dua tatasusunan dalam PHP? Bagaimana untuk menggabungkan dua tatasusunan dalam PHP? Sep 21, 2025 am 12:26 AM

UseArray_Merge () toCombineArrays, OverwritingDuplicateStringKeySandreIndexingNumericKeys; forsimplerconcatenation, terutamaInphp5.6, usethesplatoperator [... $ array1, ... $ array2].

MySQL Agregasi Bersyarat: Gunakan Penyataan Kes untuk Melaksanakan Sumsum dan Mengira Kondisi Simpanan MySQL Agregasi Bersyarat: Gunakan Penyataan Kes untuk Melaksanakan Sumsum dan Mengira Kondisi Simpanan Sep 16, 2025 pm 02:39 PM

Artikel ini membincangkan secara mendalam bagaimana menggunakan pernyataan kes untuk melakukan pengagregatan bersyarat di MySQL untuk mencapai penjumlahan bersyarat dan mengira bidang tertentu. Melalui kes sistem langganan praktikal, ia menunjukkan bagaimana secara dinamik mengira jumlah tempoh dan bilangan peristiwa berdasarkan status rekod (seperti "akhir" dan "membatalkan"), dengan itu mengatasi batasan fungsi jumlah tradisional yang tidak dapat memenuhi keperluan pengagregatan bersyarat kompleks. Tutorial menganalisis penerapan pernyataan kes dalam jumlah fungsi secara terperinci dan menekankan pentingnya bersatu ketika berurusan dengan nilai nol yang mungkin dari gabungan kiri.

Bagaimana cara menggunakan ruang nama dalam projek PHP? Bagaimana cara menggunakan ruang nama dalam projek PHP? Sep 21, 2025 am 01:28 AM

Namespacesinphporganizecodeandpreventnamingnamingconflictsbygroupinglasses, antara muka, fungsi, dan constantsunderaspecificname.2.defineAnamespaceusingthenamespaceywordetopofafile, diikuti olehbythenamespaceakenam

Apakah kaedah sihir dalam php dan memberikan contoh `__call ()` dan `__get ()`. Apakah kaedah sihir dalam php dan memberikan contoh `__call ()` dan `__get ()`. Sep 20, 2025 am 12:50 AM

The__call () methodistriggeredWhenaninaccessibleorundefinedmethodiscalledonanObject, membolehkanCustomHandlylyAccepteThemeThodnamnamnamnents, asshownwhencallingundefinedmethodslikesayhello ()

Bagaimana untuk mengemas kini rekod dalam pangkalan data dengan PHP? Bagaimana untuk mengemas kini rekod dalam pangkalan data dengan PHP? Sep 21, 2025 am 04:47 AM

Toupdateadatabaserecordinphp, firstConnectusingPdoormySqli, thenusePePreparedStatementStoExecuteAseCureSqlupDateQuery.example: $ pdo = newpdo ("mysql: host = localhost; dbName = your_database: $ userbase: $ userbase"

Bagaimana untuk mendapatkan sambungan fail dalam PHP? Bagaimana untuk mendapatkan sambungan fail dalam PHP? Sep 20, 2025 am 05:11 AM

UsePathinfo ($ FileName, pathinfo_extension) togetthefileextension; itreliLyHandlesmultipledotsandgecases, returnTheExtension (mis., "Pdf") Oranemptystringifnoneexists.

See all articles