为什么我的 do-while "do" 行在 "while" 之前执行两次
Why does my do-while "do" line execute twice before "while"
当我执行下面的代码时,do{}
行执行了两次,在 while()
检查之前将 $item
和 false
分开。 $allItems
是一个对象的数组。为什么要执行两次?不应该$item
直接拿起弹出的成员继续检查吗?
// $allItems is an array of one object
do {
$item = array_pop($allItems);
} while (
$item->getProductId() != $product->getId() || count($allItems) <= 0
);
您只需从 while 条件 count($allItems) <= 0
中删除等号即可。因为你首先有一个项目会在一次迭代后将计数减少到 0 但这不会触发你的 while 所以它会进行第二次迭代。
另一种可能性是切换到 while 循环,这样它会在执行代码之前检查条件。
如果 $allitems 有一个项目,它将弹出该项目,使计数为 0。你的 while 说当计数等于 0 时继续弹出,所以它再次弹出 - 但 allitems 是空的。那失败了。您得到一个空值,然后尝试使用 NULL->getProductID()。您需要将比较更改为:
$item->getProductId() != $product->getId() && count($allItems) > 0
这将在 $allitems 仍有要弹出的项目时弹出。
当我执行下面的代码时,do{}
行执行了两次,在 while()
检查之前将 $item
和 false
分开。 $allItems
是一个对象的数组。为什么要执行两次?不应该$item
直接拿起弹出的成员继续检查吗?
// $allItems is an array of one object
do {
$item = array_pop($allItems);
} while (
$item->getProductId() != $product->getId() || count($allItems) <= 0
);
您只需从 while 条件 count($allItems) <= 0
中删除等号即可。因为你首先有一个项目会在一次迭代后将计数减少到 0 但这不会触发你的 while 所以它会进行第二次迭代。
另一种可能性是切换到 while 循环,这样它会在执行代码之前检查条件。
如果 $allitems 有一个项目,它将弹出该项目,使计数为 0。你的 while 说当计数等于 0 时继续弹出,所以它再次弹出 - 但 allitems 是空的。那失败了。您得到一个空值,然后尝试使用 NULL->getProductID()。您需要将比较更改为:
$item->getProductId() != $product->getId() && count($allItems) > 0
这将在 $allitems 仍有要弹出的项目时弹出。