我在另一个foreach
循环中有一个foreach
循环,代码如下:
foreach($array1 as $uid => $somevalues) {
$status = true;
foreach($somevalues as $somevalue)
if(!isset($somevalue->$someothervalue))
$status = false;
if($status) {
$content .= "some content added";
$count++;
}
}
工作原理
如您所见,我正在遍历$array1
中的所有条目。对于每个条目,我遍历包含的$somevalues
数组以查找某个条件(那里存在$someothervalue
)。现在,如果此条件(某些内容isset
)不正确,则$status
会更改为false
。
只有在内部$status
的所有循环之后foreach
仍然为真时,我希望进行一些操作(一些内容添加到文本字符串$content
和一个凸起的计数器)。
目标
我正在使用的数组可能非常大,我一直在查看break
和continue
命令,试图跳过不必要的部分来改进代码并让脚本运行更少环路。
正如您所看到的,如果来自内部foreach
的循环导致$status=false
,那么我们可以将其停在那里(此处不需要进一步的循环)。 break
有助于跳过剩余的forearch
循环。
如果是这种情况,那么我们也可以从外部foreach
跳过当前外部循环的其余部分,因为现在$status
false
不会运行任何代码。为此,continue
命令对于让我们跳过当前外部循环的其余部分并立即转到下一个数组行非常有用。
问题
我一直在查看命令行break 2
和continue 2
,例如让你跳过当前和外部循环(两步)以及它们各自的结果(完全停止循环或跳过当前循环的其余部分)。它们分别作为双重休息 - 作为“break break
” - 以及双重继续 - 作为“continue continue
”。
但是,如果你明白我的话,我需要break continue
这样的东西。第一个循环应为break
,下一个应为continue
。我试图避免在没有必要的情况下到达代码中的if
语句。检查已经完成,感觉就像做了不必要的仔细检查。
我希望问题很清楚。有没有一种方法可以在内部foreach
内双重跳过,但是有两个不同命令的作用break continue
?
答案 0 :(得分:2)
"标志"变量主要是代码气味,并且表明您实际应该使用函数:
function all_valid($somevalues) {
foreach($somevalues as $somevalue)
if(!isset($somevalue->$someothervalue))
return false;
return true;
}
foreach($array1 as $uid => $somevalues) {
if(all_valid($somevalues) {
do stuff
如果您准备牺牲性能的可读性,那么如何:
foreach($array1 as $uid => $somevalues) {
foreach($somevalues as $somevalue)
if(!isset($somevalue->$someothervalue))
goto next; // I don't believe I wrote this
$content .= "some content added";
$count++;
next:
}
答案 1 :(得分:1)
只需使用continue 2
,它将在第一个循环中“break
”,并在外部循环中continue
。
foreach([1, 2, 3] as $i) {
echo $i . PHP_EOL;
foreach([4, 5, 6] as $ii) {
continue 2;
}
echo 'this will never print' . PHP_EOL;
}
将打印:
1
2
3
答案 2 :(得分:1)
foreach($array1 as $uid => $somevalues) {
// Task of loop 1
foreach($somevalues as $somevalue){
// Task of loop 2
if(!isset($somevalue->$someothervalue))
{
continue 2;
break;
}
}
}