多个嵌套循环不能按预期工作

时间:2014-12-22 18:56:02

标签: php for-loop while-loop

以下情况:

我在数据库中查询条目,用于测试目的,限制为100:

$stmt = $dbh->prepare("SELECT sell FROM products LIMIT 100");
$stmt->execute();

    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

然后我进入while循环,我只能在每个函数调用中使用(和使用)20个条目,所以我将20提取到$List

while ($result) {
/...
$List->setSell(array($result[0]['sell'], $result[1]['sell'], $result[2]['sell'], $result[3]['sell'], $result[4]['sell'], $result[5]['sell'], $result[6]['sell'], $result[7]['sell'], $result[8]['sell'], $result[9]['sell'], $result[10]['sell'], $result[11]['sell'], $result[12]['sell'], $result[13]['sell'], $result[14]['sell'], $result[15]['sell'], $result[16]['sell'], $result[17]['sell'], $result[18]['sell'], $result[19]['sell']));

现在调用一个使用结果集的函数,然后删除20个条目并重置数组值:

for ($x= 0;$x<20;$x++) {
        unset($result[$x]);
        $result = array_values($result);
    }

while循环没有评论:

 while ($result) {
    /...
    $List->setSell(array($result[0]['sell'], $result[1]['sell'], $result[2]['sell'], $result[3]['sell'], $result[4]['sell'], $result[5]['sell'], $result[6]['sell'], $result[7]['sell'], $result[8]['sell'], $result[9]['sell'], $result[10]['sell'], $result[11]['sell'], $result[12]['sell'], $result[13]['sell'], $result[14]['sell'], $result[15]['sell'], $result[16]['sell'], $result[17]['sell'], $result[18]['sell'], $result[19]['sell']));

 for ($x= 0;$x<20;$x++) {
            unset($result[$x]);
            $result = array_values($result);
        }
echo "<pre>";
var_dump($result);
echo "</pre>";
}

看起来它部分正常工作,如上图所示,在while关闭括号之前执行var_dump时,我得到以下输出。

array(80) {...}
array(60) {...}
array(40) {...}
array(20) {...}

这是预期的,但是在二十岁之后它会进入

array(10) {...}
array(5) {...}
array(2) {...}
array(1) {...}
array(0) {...}

所以我不明白为什么我得到那些10,5,2和1值的数组以及我在这里做错了什么。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

您正在删除条目的for()循环中修改数组。考虑一个简单的5元素数组会发生什么:

   0 => 10
   1 => 20
   2 => 30
   3 -> 40
   4 -> 50

你的for / unset循环启动并执行unset(0),留下你的

1 => 20
...
4 -> 50

然后调用array_values(),并将$ result数组替换为新的仅值数组,以便最终得到

0 => 20
1 => 30
2 => 40
3 => 50

循环继续,现在你执行unset(1),所以你最终得到了

0 => 20
2 => 40
3 => 50

并在array_values()后获得

0 => 20
1 => 40
2 => 50

接下来你做unset(2),现在没有其他任何内容可以改变 - 你还没有设置密钥(unset(3)unset(4)) 39; t存在,之后剩余的值都将具有相同的密钥。

如果您尝试删除前20个条目,那么 DON&#39; T 会在您的循环中执行array_values()调用。它应该是

for ($x= 0;$x<20;$x++) {
     unset($result[$x]);
}
$result = array_values($result);

或者你可以使用array_splice()并完全跳过for / unset的东西。

答案 1 :(得分:3)

而不是

for ($x= 0;$x<20;$x++) {
        unset($result[$x]);
        $result = array_values($result);
}

for ($x= 0;$x<20;$x++) {
    array_shift ($result);
}