以下情况:
我在数据库中查询条目,用于测试目的,限制为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值的数组以及我在这里做错了什么。有人可以帮忙吗?
答案 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);
}