Practical PHP Programming

循环嵌套

你可以直接在一个循环体中嵌套另一个循环,就像这样:

 for ($i = 1; $i < 3; $i = $i + 1) {
    for ($j = 1; $j < 4; $j = $j + 1) {
        for ($k = 1; $k < 3; $k = $k + 1) {
            print "I: $i, J: $j, K: $k\n";
        }
    }
}

上面的代码输出:

I: 1, J: 1, K: 1
I: 1, J: 1, K: 2
I: 1, J: 2, K: 1
I: 1, J: 2, K: 2
I: 2, J: 1, K: 1
I: 2, J: 1, K: 2
I: 2, J: 2, K: 1
I: 2, J: 2, K: 2

这种情况下用break就有点复杂了,因为它只跳出离它最近的循环:

 for ($i = 1; $i < 3; $i = $i + 1) {
    for ($j = 1; $j < 3; $j = $j + 1) {
        for ($k = 1; $k < 3; $k = $k + 1) {
            print "I: $i, J: $j, K: $k\n";
            break;
        }
    }
}

这次的输出是:

I: 1, J: 1, K: 1
I: 1, J: 2, K: 1
I: 2, J: 1, K: 1
I: 2, J: 2, K: 1

如上所示,$k只循环了一次就被打断了,而其他循环都循环了若干次。你可以尝试在break后加个数字,如break 2来跳出两次循环或switch - case语句。例如:

 for ($i = 1; $i < 3; $i = $i + 1) {
    for ($j = 1; $j < 4; $j = $j + 1) {
        for ($k = 1; $k < 3; $k = $k + 1) {
            print "I: $i, J: $j, K: $k\n";
            break 2;
        }
    }
}

会输出

I: 1, J: 1, K: 1
I: 2, J: 1, K: 1

这次,整个循环只执行了两次,因为$k内部调用了break 2,跳出了$k$j的循环。如果换成break 3的话,将会跳出全部三个循环,继续下面的代码。

需要注意的是,breakswitch - case语句和循环中都起作用,例如:

 for ($i = 1; $i < 3; $i = $i + 1) {
    for ($j = 1; $j < 4; $j = $j + 1) {
        for ($k = 1; $k < 3; $k = $k + 1) {
            switch($k) {
                case 1:
                    print "I: $i, J: $j, K: $k\n";
                    break 2;
                case 2:
                    print "I: $i, J: $j, K: $k\n";
                    break 3;
            }
        }
    }
}

break 2跳出了switch - case$k循环,而break 2跳出了switch - case和两层循环。如果想要从switch - case中完全跳出循环,则需要break 4了。