


Bina Pilihan Produk secara dinamik: Dari data rata ke struktur bersarang
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
- 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).
- 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.
- 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.
- 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.
- 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.
- 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!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Stock Market GPT
Penyelidikan pelaburan dikuasakan AI untuk keputusan yang lebih bijak

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

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

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

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

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.

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

The__call () methodistriggeredWhenaninaccessibleorundefinedmethodiscalledonanObject, membolehkanCustomHandlylyAccepteThemeThodnamnamnamnents, asshownwhencallingundefinedmethodslikesayhello ()

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

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