2010-03-01 20 views
5

मैं निम्नलिखित PHP कोड जो सरणियों का एक सेट से संभव संयोजनों बाहर काम करता है:मैं इस रिकर्सिव फ़ंक्शन के परिणामों को कैसे संग्रहीत करूं?

function showCombinations($string, $traits, $i){ 

    if($i >= count($traits)){ 

     echo trim($string) . '<br>'; 

    }else{ 

     foreach($traits[$i] as $trait){ 
      showCombinations("$string$trait", $traits, $i + 1); 
     } 

    } 

} 

$traits = array(
      array('1','2'), 
      array('1','2','3'), 
      array('1','2','3') 
      ); 

showCombinations('', $traits, 0); 

हालांकि, मेरी समस्या यह है कि मैं प्रसंस्करण के लिए एक सरणी में परिणाम की दुकान बाद में के बजाय सिर्फ उन्हें मुद्रित करने के लिए की जरूरत है बाहर लेकिन मैं नहीं देख सकता कि वैश्विक वैरिएबल का उपयोग किए बिना यह कैसे किया जा सकता है।

क्या कोई मुझे ऐसा कुछ परिणाम देने के लिए वैकल्पिक तरीके से जानता है या मुझे परिणाम देने के लिए संशोधित करता है जिसका उपयोग मैं कर सकता हूं?

उत्तर

11

उन्हें वापस करें। showCombinations() आइटम की एक सूची वापस करें। पहले मामले में आप केवल एक आइटम लौटाते हैं, अन्य रिकर्सिव केस में आप विलय की सभी लौटाई गई सूचियों के साथ एक सूची लौटाते हैं। उदाहरण के लिए:

function showCombinations(...) { 
    $result = array(); 
    if (...) { 
     $result[] = $item; 
    } 
    else { 
     foreach (...) { 
      $result = array_merge($result, showCombinations(...)); 
     } 
    } 
    return $result; 
} 
+0

इसके लिए धन्यवाद, मुझे कल एक मानसिक ब्लॉक का थोड़ा सा सामना करना पड़ा - वास्तव में जल्दी भी! – Tom

+0

इसके लिए धन्यवाद। मैं संदर्भ द्वारा परिणाम सरणी पास कर रहा था लेकिन यह बहुत साफ महसूस करता है। –

+0

बहुत बहुत धन्यवाद, lifesaver! – Liko

0

परिणामों को $ _SESSION चर में संग्रहीत करें।

0

परिवर्तनीय स्कोप संशोधक static का उपयोग कर काम कर सकता है। वैकल्पिक रूप से, आप संदर्भों को नियोजित कर सकते हैं, लेकिन यह पास करने के लिए केवल एक और चर है। यह "रिटर्न सिंटैक्स" के साथ काम करता है।

function showCombinations($string, $traits, $i){ 
    static $finalTraits; 
    if (!is_array($finalTraits)) { 
     $finalTraits = array(); 
    } 
    if($i >= count($traits)){ 

     //echo trim($string) . '<br>'; 
     $finalTraits[] = $string; 

    } else { 

     foreach($traits[$i] as $trait){ 
      showCombinations("$string$trait", $traits, $i + 1); 
     } 

    } 
    return $finalTraits; 
} 

$traits = array(
      array('1','2'), 
      array('1','2','3'), 
      array('1','2','3') 
      ); 

echo join("<br>\n",showCombinations('', $traits, 0)); 

बेशक, इस के रूप में ठीक एक बार की उम्मीद काम करेंगे, इससे पहले कि चर के स्थिर प्रकृति तुम्हारे साथ फैल जाती है।

function showCombinations($string, $traits, $i){ 
    $finalTraits = array(); 
    if($i >= count($traits)){ 
     $finalTraits[] = $string; 
    } else { 
     foreach($traits[$i] as $trait){ 
      $finalTraits = array_merge(
           $finalTraits, 
           showCombinations("$string$trait", $traits, $i + 1) 
           ); 
     } 
    } 
    return $finalTraits; 
} 
+0

यदि आप फ़ंक्शन को कई बार कॉल करते हैं तो डीबग करना मजेदार होगा। –

+0

प्वाइंट पहले से ही संबोधित किया गया है। – Dereleased

1

अन्य उत्तर के अलावा, आप एक सरणी का पता चारों ओर अपने समारोह के अंदर पारित सकता है, लेकिन ईमानदारी से यह लगभग यह करने के लिए सबसे अच्छा तरीका नहीं है: इसलिए, यह शायद एक बेहतर समाधान है।

0

हालांकि लुकास का समाधान शुद्ध नहीं है क्योंकि इसका कोई दुष्प्रभाव नहीं है, यह बड़े इनपुट पर अप्रभावी हो सकता है, क्योंकि यह इंजन को लगातार नए सरणी उत्पन्न करने के लिए मजबूर करता है। वहाँ दो अधिक तरीकों कि होने लगते हैं कम स्मृति लेने वाली

  • एक परिणाम सरणी संदर्भ द्वारा पारित कर दिया है और $ के साथ गूंज कॉल की जगह परिणाम [] =
  • (पसंदीदा) एक वर्ग में पूरी कहानी लपेट और $ इस- का उपयोग> परिणाम जब उचित

वर्ग दृष्टिकोण विशेष रूप से अच्छा है जब php iterators

0
public function pageslug_genrator($slug,$cat){ 


    $page_check=$this->ci->cms_model->show_page($slug); 

     if($page_check[0]->page_parents != 0){ 

     $page_checks=$this->ci->page_model->page_list($page_check[0]->page_parents); 
     $cat[]=$page_checks['re_page'][0]->page_slug; 
     $this->pageslug_genrator($page_checks['re_page'][0]->page_slug,$cat);  

     } 
    else 
     { 
     return $cat; 

     } 
    } 

इस समारोह does not कोई मान के साथ उपयोग किया है लेकिन जब मैं print_r $ cat कर रहा हूं तो यह

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