2013-09-05 12 views
9

मैं बस यह सुनिश्चित करना चाहता हूं कि मैं इसे सही करता हूं और यह कोई भी अभिसरण नहीं बनाएगा।रिकर्सिव फ़ंक्शन: कॉल php फ़ंक्शन स्वयं

मेरे पास एक ऐसा फ़ंक्शन है जो स्वयं को कॉल करता है और यदि यह ठीक है या ऐसा नहीं है तो आपकी स्वीकृति की आवश्यकता है?

<?php 

function determine($the_array){ 
    foreach ($the_array as $key => $value) { 
     switch ($key) { 
      case 'in': 
        echo $value; 
       break; 

      case 'out': 
        echo $value; 
       break; 

      case 'level': 
        echo '<ul>'; 
        determine($value); 
        echo '</ul>'; 
       break; 

     } 
    } 

} 

इस सरणी है:

$the_array = array(
    'in' => '<li>Simple IN</li>', 
    'out' => '<li>Simple OUT</li>', 
    'level' => array(
      'in' => '<li>Simple IN 2</li>', 
      'out' => '<li>Simple OUT 2</li>', 
      'level' => array(
       'in' => '<li>Simple IN 3</li>', 
       'out' => '<li>Simple OUT 3</li>' 
      ), 
     ), 
); 

और यहाँ अंतिम init है:

echo '<ul>'; 
determine($the_array); 
echo '</ul>'; 

परिणाम सिर्फ है कि कैसे मैं बनना चाहता था, यह बहुत अच्छा काम करता है, लेकिन मैं डॉन यह नहीं पता कि यह एक अच्छा अभ्यास है या नहीं।

उत्तर

26

रिकर्सिव फ़ंक्शन ठीक हैं - लेकिन खतरनाक यदि आप सुनिश्चित नहीं हैं कि आप जानते हैं कि आप क्या कर रहे हैं। यदि कोई मौका है कि एक फ़ंक्शन एक रिकर्सिव लूप (जहां यह स्वयं को कॉल करता रहता है) में समाप्त हो जाएगा, तो आप या तो समय निकाल देंगे, मेमोरी से बाहर हो जाएंगे या ज़ोंबी सर्वनाश का कारण बनेंगे।

एक अनुभवी शेफ के हाथों में एक वास्तव में, वास्तव में तेज चाकू के रूप में रिकर्सिव कॉल के बारे में सोचें - यह डिशवॉशर के हाथों स्वर्ग में बनाया गया एक मैच है, यह एक खोई हुई उंगली होने का इंतजार कर रही है।

PHP अच्छा खेलने की कोशिश करता है, और डिफ़ॉल्ट रूप से 100 तक रिकर्सिव गहराई को सीमित करता है (हालांकि इसे बदला जा सकता है) लेकिन लगभग सभी मामलों के लिए, यदि आपकी रिकर्सिव गहराई 100 हो जाती है, तो दुर्घटना पहले से ही हो चुकी है और PHP रोककर प्रतिक्रिया करता है यातायात में घूमने से कोई अतिरिक्त पैदल यात्री। :)

+2

या छोटा: पुनरावर्ती कार्य एक बुरा अभ्यास नहीं है। :) – Virus721

+1

@ वायरस 721 हां और नहीं, अगर आप नहीं जानते कि आप क्या कर रहे हैं, तो वे एक बुरे अभ्यास की तरह हैं :) – Fluffeh

+1

इस मामले में खराब अभ्यास यह नहीं कर रहा है कि आप क्या कर रहे हैं, इसका उपयोग नहीं कर रहे हैं रिकर्सिव फ़ंक्शन। – Virus721

3

Fluffeh ने रिकर्सिव कार्यों के संबंध में पर्याप्त उत्तर प्रदान किया। लेकिन बड़े सरणी/वस्तुओं/आदि के साथ रिकर्सन का उपयोग करते समय, आपको अपने कोड का अनुकूलन देखना चाहिए, ताकि इसे निष्पादित करने के लिए अधिक मेमोरी या सीपीयू पावर न हो।

आप आसानी से क्लीनर होने के लिए अपने कोड को अनुकूलित कर सकते हैं, कम स्मृति ले सकते हैं और अप्रत्याशित डेटा के लिए अधिक लचीला हो सकते हैं। फ़ंक्शन तर्क सूची में & पर ध्यान दें (यह हर बार एक नेस्टेड फ़ंक्शन कहलाता है) यह एक सरणी की एक प्रति बनाने को समाप्त करता है)।

function determine(& $the_array){ 
foreach ($the_array as $key => $value) { 
    switch ($key) { 
     case 'in': 
     case 'out': 
       echo $value; 
      break; 

     case 'level': 
      if (!is_array($value)) break; 
       echo '<ul>'; 
       determine($value); 
       echo '</ul>'; 
      break; 

     } 
    } 
} 
0

मुझे लगता है कि अगर आप सरणी की गहराई पता है कि यह

$list = ""; 
foreach ($the_array as $array) { 
    if(is_array($array)) { 
     foreach($array as $sub_array) { 
      if(is_array($sub_array)) { 
       foreach($sub_array as $sub_array_2) { 
        $list .= "$sub_array_2"; 
       } 
      } else { 
      $list .= "$sub_array"; 
      } 
     } 
    } else { 
     $list .= "$array"; 
    } 
} 

echo "<ul>$list</ul>"; 
1

उपयोग करने के लिए मैं नहीं जानता, अगर यह एक अच्छा समाधान है, लेकिन मैं खुद को अंदर से एक समारोह कॉल करने के लिए इस एक का उपयोग अच्छा है:

function my_calucar(){ 
    $arrayy= array('mine' => '1', 'yours' => '24', 'her' => '34'); 
    foreach ($arrayy as $each=>$value) { 
     switch ($each) { 
     default: 
       my_calucar($value); 
     } 
    } 
} 
संबंधित मुद्दे