PHP перерыв пока делают изнутри вложенного foreach - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть петля do while и вложенная петля foreach.И я использую break 2, чтобы сломать оба (do while и foreach), если $x > N (в данном случае N = 4).Пока это работает, но ... это хорошая практика?Или я должен разорвать цикл while другим способом?

$arr = ['a', 'b', 'c'];
$x = 0;

do{

    //do something here...

    //and something here...

    foreach($arr as $k => $v){
        if($x > 4){
            break 2;
        } else{
            echo '(' . $x . ')' . $k . ' - ' . $v . '<br />';
        }
    }

    $x++;
} while($x < 10);

Спасибо!: D

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Использование цикла do{}while(); должно быть очень обдуманным решением.Его поведение вызывает начальную итерацию и проверяет только условия перерыва в конце каждой итерации.

Сравните это с циклом while() или лучше для ваших целей a for() петля.Он выполняет условную проверку перед каждой итерации И счетчик, условие (я) разрыва и приращение находятся в одном читаемом месте.

Я не уверен, действительно ли вы имеете в видувыполнить ...

//do something here...
//and something here...

... на той же итерации, где происходит break 2.Какие обстоятельства делают это подходящим для вашего проекта?Логика вашего фрагмента говорит, что вы хотите выполнить эти загадочные строки кода, когда $ x = 0, 1, 2, 3, 4 и 5;но блок foreach() должен выполняться только тогда, когда $ x = 0, 1, 2, 3 и 4.

Если я прав, ваша логика проектирования немного ошибочна, я не рекомендую писатьbreak точка внутри вашего цикла с другими процессами.Я рекомендую петлю for().

$arr = ['a', 'b', 'c'];

for ($x = 0; $x <= 4; ++$x) {
    //do something here...
    //and something here...

    foreach ($arr as $k => $v){
        echo "($x)$k - $v<br />";
    }
}

Из-за вашего break 2 ваше while($x < 10); условие никогда не будет выполнено, поэтому это нелогичное включение в проект.


Если вам действительно необходимо выполнить эти загадочные строки, но не циклические эхо-сигналы при $x = 5, то полностью отмените управление циклом до разрыва и используйте while(true) (запись неопределенного цикла), чтобы устранить замешательство разработчика.

$arr = ['a', 'b', 'c'];
$x = 0;
while (true) {
    //do something here...
    //and something here...

    if ($x > 4) {
        break 2;
    }
    foreach ($arr as $k => $v) {
        echo "($x)$k - $v<br />";
    }

    ++$x;
}
0 голосов
/ 26 сентября 2018

В вашем примере break 2 будет работать нормально, и да, это часть PHP.Тем не менее, я всегда беспокоился о разрыве циклов, особенно когда они вложенные.

Подумайте, работали ли вы над кодом, который был намного более сложным, чем с вложенными циклами.Когда вы указали разрыв из двух циклов, вам нужно быть очень осторожным, чтобы учесть разрывы в любом новом коде.

Поэтому, хотя использование разрыва может работать, я всегда стараюсь избегать разрывов иВсегда учитывайте, есть ли другая опция, которая работает без разрывов (особенно если у вас есть вложенные циклы).В вашем примере я бы использовал код:

$arr = ['a', 'b', 'c'];
$x = 0;

do{
    //do something here...
    //and something here...

    foreach($arr as $k => $v){
        echo '(' . $x . ')' . $k . ' - ' . $v . '<br />';
    }

    $x++;
} while($x <= 4);

Это обычно приводит к более аккуратному коду, который легче поддерживать.

...