为什么我的 do-while "do" 行在 "while" 之前执行两次

Why does my do-while "do" line execute twice before "while"

当我执行下面的代码时,do{} 行执行了两次,在 while() 检查之前将 $itemfalse 分开。 $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 仍有要弹出的项目时弹出。