अगर और बाहर तोड़ दिया


277

मेरे पास एक फॉरेस्ट लूप है और एक स्टेटमेंट है। यदि कोई मैच पाया जाता है, तो मुझे अंततः फॉर्च्यूनर से बाहर निकलने की आवश्यकता है।

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        <break out of if and foreach here>
    }       
}

php नहीं js के लिए। मैं यह नहीं मान सकता कि वे समान व्यवहार करते हैं।
au_stan

6
gee - मुझे jQuery का उपयोग बंद करना है। ऐसा क्यों हुआ? +1, पूरी तरह से उचित और अच्छी तरह से प्रस्तुत प्रश्न।
म्रतशर्मन

11
मैंने केवल सवाल पूछा क्योंकि (जो भी कारण से) मैं php ब्रेक डॉक्टर और उनके उदाहरणों के आसपास अपना सिर नहीं लपेट सकता था। हालांकि सभी अच्छे हैं। मैं यहाँ बिल्ला और अंक प्राप्त करने के लिए नहीं हूँ, बस ठीक जवाब।
au_stan

जवाबों:


610

if एक लूप संरचना नहीं है, इसलिए आप इसे "तोड़ नहीं सकते"।

हालाँकि, आप foreachकेवल कॉल करके ही ब्रेक आउट कर सकते हैं break। आपके उदाहरण में इसका वांछित प्रभाव है:

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;

        // will leave the foreach loop and also the if statement
        break;
    }
    this_command_is_not_executed_after_a_match_is_found();
}

बस दूसरों के लिए पूर्णता है कि इस सवाल पर ठोकर के लिए एक जवाब की तलाश में ..

breakएक वैकल्पिक तर्क लेता है, जो परिभाषित करता है कि इसे कितने लूप संरचनाओं को तोड़ना चाहिए। उदाहरण:

foreach (array('1','2','3') as $a) {
    echo "$a ";
    foreach (array('3','2','1') as $b) {
        echo "$b ";
        if ($a == $b) { 
            break 2;  // this will break both foreach loops
        }
    }
    echo ". ";  // never reached
}
echo "!";

परिणामी उत्पादन:

१ ३ २ १ १!


37
+1 - कुछ अनुभवहीन प्रोग्रामर के लिए महान उदाहरण कभी-कभी संघर्ष करते हैं।
जिम डी

1
उपयोगी, धन्यवाद। तर्क का उल्लेख करने के लिए अतिरिक्त कर्म। अगर-लूप चीज एक हैक की तरह लगती है, हालांकि। क्यों नहीं बाकी बयानों को एक और में लपेटो? मुझे पता है कि आप सिर्फ मददगार बनने की कोशिश कर रहे थे, लेकिन नए नोटों पर ध्यान दें।
डैन बैरन

3
आप यहां से उतरने वालों के लिए लेकिन खोज कर सकते हैं कि एक लूप से बाहर कैसे निकलना है जिसमें शामिल विवरण जारी रखने के बजाय रिटर्न का उपयोग करें।
निक कॉन्सटेंटाइन

क्या होगा अगर इसका स्विच स्टेटमेंट? स्विच स्टेटमेंट भी ब्रेक का उपयोग करते हैं। क्या कोई व्यक्ति स्विच के अंदर दो ब्रेक लगाएगा जैसे {केस "ब्रेक": गूंज 'स्विच को तोड़ें और लूप'; तोड़; तोड़; }?
Jevon

@ जेवॉन नहीं, आप केवल switch($a) { case 'x': switch($b) { case 'x': break 2; }; break; } आंतरिक break 2पत्तियों को दोनों स्विच स्टेटमेंट लिखेंगे ।
काई

13
foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        break;
    }
}

बस उपयोग करें break। वह कर देगा।


तो फिर विराम से ब्रेक टूट रहा है और यदि नहीं। मुझे लगता है कि मेरा भ्रम इस कथन से था जो if ($abort_if_block) break;मैंने मूल रूप से निर्धारित किया था break 2और यह विफल रहा। धन्यवाद
au_stan

2
ब्रेक निर्माण के लिए बाहर देखो। अगर आप भूल जाते हैं; इसके बाद, इसे अगली अभिव्यक्ति का परिणाम मिल सकता है और अनपेक्षित रूप से व्यवहार करना शुरू कर सकता है (जैसे कि आप जितना चाहते थे उससे कहीं अधिक बाहर कूदते हैं)। मुझे पता है कि हर कोई GOTO के उपयोग के खिलाफ सुझाव देता है, लेकिन मुझे लगता है कि, उन सभी मामलों के लिए जब आप वास्तव में ब्रेक का उपयोग करने से बेहतर नहीं कर सकते हैं, एक गोटो एक बेहतर विकल्प हो सकता है। बेशक, फॉरवर्ड जंपिंग के लिए (बहुत दूर भी नहीं) केवल और बिना गाली के! ;-)
maraspin

2

PHP में एक लूप foreachया whileलूप को तोड़ने के लिए एक सुरक्षित तरीका है ifमूल लूप के अंदर एक वर्धित काउंटर चर और सशर्त घोंसला बनाना । यह आपको एक सख्त नियंत्रण देता है break;जिससे जटिल पृष्ठ पर कहीं और कहर हो सकता है।

उदाहरण:

// Setup a counter
$ImageCounter = 0;

// Increment through repeater fields
while ( condition ):
  $ImageCounter++;

   // Only print the first while instance
   if ($ImageCounter == 1) {
    echo 'It worked just once';
   }

// Close while statement
endwhile;

वाक्यविन्यास सही नहीं है। यदि आप endwhileकथन का उपयोग करना चाहते हैं , तो आपको लिखने की आवश्यकता है while (..): ...; endwhile;- बाद में यहां कोलन पर ध्यान दें while!
काई

0

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

<?php

for ($i=0; $i < 100; $i++) { 
    if (i%2 == 0) {
        include(do_this_for_even.php);
    }
    else {
        include(do_this_for_odd.php);
    }
}

?>

यदि आप do_this_for_even.php के अंदर होने पर विराम चाहते हैं, तो आपको रिटर्न का उपयोग करने की आवश्यकता है। ब्रेक का उपयोग करना या जारी रखना इस त्रुटि को लौटाएगा: 1 स्तर को तोड़ / जारी नहीं रख सकता। मुझे यहाँ अधिक जानकारी मिली

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.