【问题标题】:multiple nested loops don't work as expected多个嵌套循环无法按预期工作
【发布时间】:2015-02-20 21:51:14
【问题描述】:

以下情况:

我在数据库中查询条目,出于测试目的限制为 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);
    }

没有 cmets 的 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 值的数组以及我在这里做错了什么。有人可以帮忙吗?

【问题讨论】:

  • 快速扫描...可能是因为array_values() 正在重新编号您的阵列?
  • 是的,但它应该这样做,因为我选择了数组的前 20 个值并将它们放入函数句柄。你认为这是错误吗? @主教
  • 嗯,真的有必要在每个循环中重置$result = array_values($result); 20x 吗?我不是 PHP 方面的专家,但我可能会寻找一种不同的方法来迭代所有 $result 的值。

标签: php for-loop while-loop


【解决方案1】:

您正在删除条目的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)),剩余的值都将具有相同的值之后的钥匙。

如果您尝试删除前 20 个条目,则不要在循环中调用 array_values()。应该是

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

或者您可以使用 array_splice() 并完全跳过 for/unset 的内容。

【讨论】:

    【解决方案2】:

    代替

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

    试试

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多