循环控制 #

一、break 语句 #

1.1 基本用法 #

break 用于立即退出循环:

php
<?php
for ($i = 1; $i <= 10; $i++) {
    if ($i === 5) {
        break;
    }
    echo $i . " ";
}

1.2 在while中使用 #

php
<?php
$i = 1;
while (true) {
    echo $i . " ";
    if ($i >= 5) {
        break;
    }
    $i++;
}

1.3 在foreach中使用 #

php
<?php
$fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry'];

foreach ($fruits as $fruit) {
    if ($fruit === 'cherry') {
        break;
    }
    echo $fruit . " ";
}

1.4 查找元素 #

php
<?php
$numbers = [10, 20, 30, 40, 50];
$target = 30;
$found = -1;

foreach ($numbers as $index => $number) {
    if ($number === $target) {
        $found = $index;
        break;
    }
}

echo $found >= 0 ? "找到,索引: $found" : "未找到";

1.5 break层级 #

break n 可以退出多层循环:

php
<?php
for ($i = 1; $i <= 3; $i++) {
    for ($j = 1; $j <= 3; $j++) {
        if ($i === 2 && $j === 2) {
            break 2;
        }
        echo "($i, $j) ";
    }
    echo "\n";
}

1.6 在switch中使用 #

php
<?php
$number = 2;

switch ($number) {
    case 1:
        echo "一";
        break;
    case 2:
        echo "二";
        break;
    case 3:
        echo "三";
        break;
}

二、continue 语句 #

2.1 基本用法 #

continue 用于跳过当前迭代,继续下一次:

php
<?php
for ($i = 1; $i <= 5; $i++) {
    if ($i === 3) {
        continue;
    }
    echo $i . " ";
}

2.2 过滤元素 #

php
<?php
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

foreach ($numbers as $number) {
    if ($number % 2 !== 0) {
        continue;
    }
    echo $number . " ";
}

2.3 跳过无效数据 #

php
<?php
$users = [
    ['name' => 'John', 'active' => true],
    ['name' => 'Jane', 'active' => false],
    ['name' => 'Bob', 'active' => true],
    ['name' => 'Alice', 'active' => false]
];

foreach ($users as $user) {
    if (!$user['active']) {
        continue;
    }
    echo $user['name'] . " ";
}

2.4 continue层级 #

php
<?php
for ($i = 1; $i <= 3; $i++) {
    for ($j = 1; $j <= 3; $j++) {
        if ($i === $j) {
            continue 2;
        }
        echo "($i, $j) ";
    }
    echo "\n";
}

2.5 在while中使用 #

php
<?php
$i = 0;
while ($i < 10) {
    $i++;
    if ($i % 3 === 0) {
        continue;
    }
    echo $i . " ";
}

三、break vs continue #

3.1 对比 #

语句 作用 效果
break 退出整个循环 不再执行后续迭代
continue 跳过当前迭代 继续下一次迭代

3.2 示例对比 #

php
<?php
echo "使用 break:\n";
for ($i = 1; $i <= 5; $i++) {
    if ($i === 3) {
        break;
    }
    echo $i . " ";
}

echo "\n使用 continue:\n";
for ($i = 1; $i <= 5; $i++) {
    if ($i === 3) {
        continue;
    }
    echo $i . " ";
}

四、goto 语句 #

4.1 基本用法 #

goto 用于跳转到指定标签:

php
<?php
$i = 1;

start:
echo $i . " ";
$i++;

if ($i <= 5) {
    goto start;
}

4.2 跳出多层循环 #

php
<?php
for ($i = 1; $i <= 3; $i++) {
    for ($j = 1; $j <= 3; $j++) {
        for ($k = 1; $k <= 3; $k++) {
            if ($i === 2 && $j === 2 && $k === 2) {
                goto end;
            }
            echo "($i, $j, $k) ";
        }
    }
}

end:
echo "\n跳出所有循环";

4.3 错误处理 #

php
<?php
function processData(array $data): bool
{
    $result = true;
    
    foreach ($data as $item) {
        if (empty($item)) {
            $result = false;
            goto cleanup;
        }
    }
    
    cleanup:
    return $result;
}

4.4 goto限制 #

  • 不能跳入函数
  • 不能跳入循环
  • 不能跳入类方法
php
<?php
goto loop;

for ($i = 0; $i < 5; $i++) {
    loop:
    echo $i;
}

4.5 不推荐使用 #

goto 会使代码难以理解和维护,应尽量避免使用:

php
<?php
$found = false;
for ($i = 1; $i <= 3 && !$found; $i++) {
    for ($j = 1; $j <= 3 && !$found; $j++) {
        if ($i === 2 && $j === 2) {
            $found = true;
        }
        if (!$found) {
            echo "($i, $j) ";
        }
    }
}

五、return 语句 #

5.1 在循环中使用 #

return 可以在循环中提前退出函数:

php
<?php
function findUser(array $users, int $id): ?array
{
    foreach ($users as $user) {
        if ($user['id'] === $id) {
            return $user;
        }
    }
    return null;
}

5.2 验证函数 #

php
<?php
function validateAll(array $items): bool
{
    foreach ($items as $item) {
        if (!isValid($item)) {
            return false;
        }
    }
    return true;
}

六、异常处理 #

6.1 使用异常退出 #

php
<?php
function processItems(array $items): void
{
    foreach ($items as $item) {
        if ($item === null) {
            throw new InvalidArgumentException("无效项");
        }
        processItem($item);
    }
}

6.2 try-catch控制 #

php
<?php
try {
    foreach ($items as $item) {
        if (hasError($item)) {
            throw new Exception("处理错误");
        }
        process($item);
    }
} catch (Exception $e) {
    echo "错误: " . $e->getMessage();
}

七、实际应用 #

7.1 搜索算法 #

php
<?php
function binarySearch(array $arr, int $target): int
{
    $left = 0;
    $right = count($arr) - 1;
    
    while ($left <= $right) {
        $mid = intdiv($left + $right, 2);
        
        if ($arr[$mid] === $target) {
            return $mid;
        }
        
        if ($arr[$mid] < $target) {
            $left = $mid + 1;
        } else {
            $right = $mid - 1;
        }
    }
    
    return -1;
}

7.2 数据验证 #

php
<?php
function validateForm(array $data): array
{
    $errors = [];
    $required = ['name', 'email', 'password'];
    
    foreach ($required as $field) {
        if (empty($data[$field])) {
            $errors[$field] = "$field 不能为空";
            continue;
        }
        
        if ($field === 'email' && !filter_var($data[$field], FILTER_VALIDATE_EMAIL)) {
            $errors[$field] = "邮箱格式不正确";
        }
        
        if ($field === 'password' && strlen($data[$field]) < 8) {
            $errors[$field] = "密码至少8位";
        }
    }
    
    return $errors;
}

7.3 批量处理 #

php
<?php
function processBatch(array $items, int $maxErrors = 3): array
{
    $processed = 0;
    $errors = 0;
    $results = [];
    
    foreach ($items as $item) {
        if ($errors >= $maxErrors) {
            break;
        }
        
        try {
            $results[] = processItem($item);
            $processed++;
        } catch (Exception $e) {
            $errors++;
            continue;
        }
    }
    
    return [
        'processed' => $processed,
        'errors' => $errors,
        'results' => $results
    ];
}

八、最佳实践 #

8.1 使用有意义的退出条件 #

php
<?php
function findFirst(array $items, callable $predicate): mixed
{
    foreach ($items as $item) {
        if ($predicate($item)) {
            return $item;
        }
    }
    return null;
}

8.2 避免深层嵌套 #

php
<?php
function process(array $items): void
{
    foreach ($items as $item) {
        if (!$item->isValid()) {
            continue;
        }
        
        if ($item->isSkipped()) {
            continue;
        }
        
        $item->process();
    }
}

8.3 使用提前返回 #

php
<?php
function findUser(int $id): ?User
{
    if ($id <= 0) {
        return null;
    }
    
    foreach ($this->users as $user) {
        if ($user->id === $id) {
            return $user;
        }
    }
    
    return null;
}

8.4 避免使用goto #

php
<?php
goto skip;
echo "这行不会执行";
skip:
echo "跳转到这里";

九、总结 #

本章学习了:

  • break语句:退出循环
  • continue语句:跳过当前迭代
  • break和continue的层级控制
  • goto语句(不推荐使用)
  • return在循环中的使用
  • 最佳实践

下一章将学习PHP函数。

最后更新:2026-03-26