вирватися з if і foreach


277

У мене є цикл foreach та твердження if. Якщо знайдеться відповідність, мені потрібно в кінцевому рахунку вирватися з авангарду.

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
Боже - я повинен так сильно припинити використовувати jQuery. чому це призвело до скоромовки? +1, цілком розумне і добре поставлене питання.
mrtsherman

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 "!";

Отриманий результат:

1 3 2 1!


37
+1 - Прекрасні приклади для чогось із недосвідченими програмістами.
Джим Д

1
Корисно, дякую. Додаткова карма для згадування аргументу. Хоча річ if-loop схожа на злом. Чому б просто не загорнути решту тверджень в іншу, якщо? Я знаю, що ви просто намагалися бути корисними, але зверніть увагу на новачків.
Ден Баррон

3
Для тих, хто ви приземлилися тут, але шукаєте, як вийти з циклу, який містить оператор include, повернення використовувати, а не продовжувати.
Нік Костянтин

Що робити, якщо його заява перемикача? Оператори перемикання також використовують перерви. Хтось просто поставив би два перерви всередині вимикача, наприклад {case "break": echo 'зламаємо перемикач і цикл'; перерва; перерва; }?
Jevon

@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
Слідкуйте за конструкцією перерви. Якщо ви забудете; після нього він може отримати результат наступного вираження і почати поводитися несподівано (IE вистрибнути набагато більше, ніж ви хотіли б). Я знаю, що всі пропонують проти використання GOTO, але я думаю, що для всіх тих випадків, коли ти не можеш зробити кращого, ніж використовувати перерву, гото може бути кращим варіантом. Звичайно, тільки для стрибків вперед (не занадто далеко) тільки і без зловживань! ;-)
maraspin

2

Більш безпечним способом підходу до розбиття foreachабо whileциклу в PHP є вкладення змінної лічильника, що збільшується, та 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

Для тих, хто ви приземлилися тут, але шукаєте, як вирватися з циклу, який містить оператор include, повернути замість розриву чи продовження.

<?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, вам потрібно використовувати return. Використання перерви або продовження поверне цю помилку: Неможливо зламати / продовжити 1 рівень. Я знайшов більш докладно тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.