संयोजन: एकाधिक नेस्टेड फोरैच से बचने - PHP, नेस्टेड, foreach, नेस्टेड-loops

जब आपको सरणी तत्वों के संयोजनों की जांच / जांच करने की आवश्यकता होती है, तो आप घोंसले के पूर्वानुमान से कैसे बच सकते हैं?

उदाहरण कोड:

$as = array($optionA1, $optionA2)
$bs = array($optionB1, $optionB2)
$cs = array($optionC1, $optionC2)

foreach ($as as $a) {
foreach ($bs as $b) {
foreach ($cs as $c) {
$result = $this->method($a, $b, $c);
if ($result) etc
}
}
}

वैकल्पिक दृष्टिकोण वाले कोई भी जो घोंसले से बच सकता है?

उत्तर:

उत्तर № 1 के लिए 7

आप अपनी खुद की इटरेटर कक्षा लिख ​​सकते हैं जो लागू करता है इटरेटर इंटरफ़ेस। इसके बाद आप इसके कन्स्ट्रक्टर को तीन सरणी स्वीकार कर सकते हैं और फिर आप फोरैच के साथ प्रत्येक संयोजन पर लूप के लिए इसका उपयोग कर सकते हैं।

हालांकि मुझे लगता है कि यह काफी धीमा होगा, इसलिए मैं इससे बचूंगा। नेस्टेड फोरैच लूप से बचने के कारणों को जानना दिलचस्प होगा?


जवाब के लिए 2 № 2

तार्किक रूप से, आपको किसी भी तरह से प्रत्येक आइटम के माध्यम से फिर से शुरू करना होगा। आप बस प्रक्रिया के चारों ओर घूम रहे हैं।

यदि लूप के लिए एकाधिक बदसूरत लगते हैं, तो शायद आपको अपने सरणी अपने स्वयं के वर्गों में रखना चाहिए, जिनके पास अपना स्वयं का encapsulated "चेक" है।


उत्तर № 3 के लिए 1

क्या आपने प्रत्येक की गिनती लेने पर विचार किया हैसरणी और कुल मिलाकर क्रमपरिवर्तन की कुल संख्या प्राप्त करने के लिए उन्हें एक साथ गुणा कर रहा है, और फिर मैं उस गिनती को फिर से करने के लिए कर रहा हूं? आपको प्रत्येक सरणी के लिए कुछ मजेदार काउंटर मैनिपुलेशन करना होगा, लेकिन इसे काम करना चाहिए।


उत्तर के लिए 1 № 4

आपने वास्तव में पर्याप्त जानकारी नहीं दी हैपता है कि विकल्प क्या है। यदि आप वास्तव में $ ($ bs और $ cs से विकल्पों के सभी संयोजनों के साथ विधि () को कॉल करना चाहते हैं, तो नेस्टेड लूप सही काम करेंगे।

क्या यह गुणा करने वाले नेस्टेड लूप हैं जो आपको परेशान करते हैं, या तथ्य यह है कि विधि () को गिनती ($ as) * गिनती ($ बीएस) * गिनती ($ सीएस) बार कहा जा रहा है?


संबंधित सवाल
सबसे लोकप्रिय