2009-07-23 11 views
5

जब आपको सरणी तत्वों के संयोजनों की जांच करने की आवश्यकता होती है, तो आप घोंसले के पूर्वानुमान से कैसे बच सकते हैं?संयोजन: एकाधिक नेस्टेड फ़ोरैच से बचने

उदाहरण कोड:

$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 
     } 
    } 
} 

वैकल्पिक तरीकों कि घोंसले से बच सकते हैं के साथ कोई भी?

+0

आप घोंसले से बचना क्यों चाहते हैं? आपके पास जो भी है वह सबसे अधिक समस्याओं के लिए पहले से ही सबसे सहज समाधान है। –

+1

स्पष्टीकरण के लिए: मैं घोंसले से बचना चाहता हूं क्योंकि यह अक्सर अच्छी तरह से कोडित या साफ प्रदर्शित करना मुश्किल हो जाता है। मुझे पता है कि इसे देने का कोई कारण नहीं है, लेकिन अगर एक साफ-सुथरा/स्लीकर विकल्प है तो मैं इसके बारे में सुनना चाहता हूं। – koen

+1

आप पुनरावृत्ति के बजाय रिकर्सन का उपयोग कर सकते हैं। यह आपके कोड से ऑब्जेक्ट मॉडल में घोंसला ले जाएगा। (यह अधिक विशिष्ट होना कठिन है क्योंकि आपका उदाहरण इतना प्रतिस्पर्धात्मक है।) – bzlm

उत्तर

7

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

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

+0

यह अच्छा होगा अगर कोई भी मुझे वोट दे तो मुझे टिप्पणी मिलेगी –

+0

टॉम मैंने आपको वोट नहीं दिया है, लेकिन मैं इस इटरेटर इंटरफ़ेस का उपयोग कैसे करूं? यदि आप मुझे एक छोटा एल्गोरिदम देते हैं तो यह उपयोगी होगा! धन्यवाद! – Neocortex

+0

@BannedfromSO वास्तव में यह सुनिश्चित नहीं है कि यह वास्तव में एक अच्छा समाधान था - तीन loops शायद अधिक स्पष्ट है, इसलिए मुझे यकीन नहीं है कि उदाहरण सार्थक है –

1

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

1

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

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

+0

यह उत्तर एक उत्कृष्ट टिप्पणी करेगा। :) – bzlm

+0

@bzlm: मैं अज्ञानता का दावा करता हूं! मैं फिर एक एसओ n00b था! :) – Ether

2

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

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

संबंधित मुद्दे