如果上次迭代满足条件,则重新启动 foreach 循环

问题描述 投票:0回答:3

当到达最后一个索引和其他一些条件时,如何重新启动 foreach 循环?

循环需要再次运行,相反,它只是停止。

foreach ($getUsers as $index => $user) {
    $userID = saveToDB($user, rand(1,1000));
    if($index == count($getUsers) && alreadyUsed($userID)) {
         reset($getUser);
         reset($index);
    }
}

这行不通。

php foreach do-while continue
3个回答
0
投票

PHP 中的 reset() 函数用于将数组的内部指针重置为其第一个元素,但它不会影响 foreach 循环的控制流程,您可以实现所需的行为,如下所示:

$continueLoop = true;

while ($continueLoop) {
    foreach ($getUsers as $index => $user) {
        $userID = saveToDB($user, rand(1,1000));

        if ($index == count($getUsers) - 1 && alreadyUsed($userID)) {
            // If you reach the last user and the userID is already used,
            // continue the outer while loop
            continue 2;
        }
    }

    // If the end of the foreach loop is reached without restarting,
    // break out of the while loop
    $continueLoop = false;
}

0
投票

我完全不明白

saveToDB()
alreadyUsed()
的作用,但是您可以通过使用后置来重新访问
foreach()
循环(不受数组指针影响,因此不需要重置)测试 while 循环。

do {
    foreach ($getUsers as $user) {
        $userID = saveToDB($user, rand(1,1000));
    }
} while (isset($userID) && alreadyUsed($userID));

这样您就不需要在循环体中使用任何笨重的变量或任何条件控制。

因为您只想在

foreach()
的最后一次迭代有机会执行
saveToDB()
后执行检查,您可以验证
foreach()
循环已进入(因此声明
$userID
),然后检查
alreadyUsed()
是否返回了真实结果。

也就是说,如果

isset($userID)
为空,需要写
$getUsers

我什至删除了

$index
变量,因为不再需要它。


-2
投票
foreach ($getUsers as $index => $user) {
    $userID = saveToDB($user, rand(1,1000));
    if ($index == count($getUsers) - 1 && alreadyUsed($userID)) {
        continue;
    }
    // Code...
}

当条件满足时,循环将跳过当前迭代的其余部分,并从下一次迭代开始,从而重新开始循环。

抱歉谷歌翻译:)

© www.soinside.com 2019 - 2024. All rights reserved.