我在另一个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
。
只有在内部foreach
的所有循环之后,$status
仍然为真,我才希望进行一些操作(将一些内容添加到文本字符串$content
和提升的计数器中)。
目标
我使用的数组可能很大,我一直在研究break
和continue
命令,试图跳过不必要的部分来改进代码,并使脚本运行更少的循环。
正如您所看到的,如果内部foreach
的循环导致$status=false
,那么我们可以立即停止它(这里不需要进一步的循环)。CCD_ 16有利于跳过其余的CCD_ 17循环。
如果是这种情况,那么我们也可以从外部foreach
跳过当前外部循环的其余部分,因为现在$status
是false
,就不会运行任何代码。为此,continue
命令将有助于我们跳过当前外循环的其余部分,并立即转到下一个数组行。
问题
我一直在查看命令行break 2
和continue 2
,例如,它们允许您跳过当前and外部循环(向上两步)及其各自的结果(要么完全停止循环,要么跳过当前循环的其余部分)。它们分别作为"break break
"answers"continue continue
"的双重中断工作。
但如果你明白我的意思的话,我需要break continue
这样的东西。第一个循环应该是break
,下一个循环应该continue
。如果没有必要,我会尽量避免在代码中使用if
语句。检查已经完成,感觉像是在做一次不必要的复查。
我希望问题是清楚的。是否有一种方法可以从内部foreach
中进行双重跳过,但会受到两个不同命令break continue
的影响?
"Flag"变量大多是一种代码气味,表明您实际上应该使用一个函数:
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:
}
只需使用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
foreach($array1 as $uid => $somevalues) {
// Task of loop 1
foreach($somevalues as $somevalue){
// Task of loop 2
if(!isset($somevalue->$someothervalue))
{
continue 2;
break;
}
}
}