为什么我的do-while“do”行在“while”

时间:2015-08-27 13:14:16

标签: php do-while

当我执行下面的代码时,do{}行执行两次,$item保留false,然后执行while()检查。 $allItems是一个对象的数组。为什么要执行两次?不应该$item只是拿起弹出的会员并继续检查吗?

// $allItems is an array of one object
do {
    $item = array_pop($allItems);
} while (
    $item->getProductId() != $product->getId() || count($allItems) <= 0
);

2 个答案:

答案 0 :(得分:1)

您只需要从while条件count($allItems) <= 0中删除等号。因为你首先有一个项目会在一次迭代后将计数减少到0,但是这不会触发你的,所以它会进行第二次迭代。

另一种可能性是切换到while循环,以便在执行代码之前检查条件。

答案 1 :(得分:1)

如果$ allitems有一个项目,它将弹出该项目,使计数等于0.你的时间表示在count等于0时保持弹出,所以它再次弹出 - 但是allitems是空的。那失败了。您得到一个null然后尝试使用NULL-&gt; getProductID()。您需要将比较更改为:

$item->getProductId() != $product->getId() && count($allItems) > 0

当$ allitems仍然有要弹出的项目时,它会弹出。