【问题标题】:(Why) should I test if an array is empty prior to a for loop?(为什么)我应该在 for 循环之前测试一个数组是否为空?
【发布时间】:2015-04-25 11:46:20
【问题描述】:

给定一个空数组$items = array();

为什么要使用下面的代码(我以前见过):

if (count($items) > 0) {
   foreach ($items as $item) // do stuff here
}

而不仅仅是

foreach ($items as $item) // do stuff here

如果count($items) === 0 循环不会执行??

【问题讨论】:

  • 我认为foreach 在评估不存在的内容时会抛出 NOTICE 或 WARNING 级别的错误,因此它确实适合喜欢保持完全干净的错误日志的程序员。
  • 不知道有没有数组的时候才做?
  • 并且foreach会在空白数组上执行并给出通知
  • 只要 $items 是一个数组,你就不需要做这个计数,除非你还想在 else 上做一些事情,比如显示“无记录”消息或类似的...... . 如果 $items 不是数组或 Travesable 对象,那么您可能需要先检查其数据类型....但是针对空数组的 foreach 不会给出任何通知或警告消息
  • @MarkBaker 感谢您的评论,这将是一个很好的答案:)

标签: php if-statement for-loop


【解决方案1】:

您通常不需要进行检查。我看到很多带有该检查的代码,但它通常是不必要的,我认为这通常是由于程序员的无知。我经常看到的类似模式是在数据库查询之后:

if (mysqli_num_rows($stmt) > 0) {
    while ($row = mysqli_fetch_assoc($stmt)) {
        ...
    }
}

这个测试也是不必要的;如果没有找到行,第一次提取将返回false,并且循环将停止。

唯一有用的情况是,如果您想告诉用户没有结果,而不是只显示一个空表。所以你可以这样做:

if (count($items) > 0) {
    echo "<table>";
    foreach ($items as $item) {
        // display table row
    }
    echo "</table>";
} else {
    echo "<b>No data found!</b>";
}

【讨论】:

  • 感谢您还提到“未找到数据”的最终用例,这很明显,但我在发布问题时没有想到!
【解决方案2】:

这实际上取决于你想做什么。正如 cmets 所指出的,您可能希望空数组成为一种特殊情况,因此您希望以不同的方式处理这种情况。否则,如果您在空数组上执行foreach,则不会抛出warning,您将不会得到任何结果。您应该执行的一个典型检查是$items 是否是一个数组,或者无论如何将$items 转换为一个数组以避免得到warning。如果你这样做了,$items 通常会被转换为一个包含一个值的数组,即 $items 在那时的值。

例如

$items = 2;
foreach((array)$items as $item) {
    print $item; //will print 2 alright
  }

if(is_array($items)) {
    foreach($items as $item) {
      print $item;
    }
}
else {
    // do something here
}

【讨论】:

  • 如果$items 应该是一个数组而不是一个数组,那很可能是一个错误。演员会隐藏错误,这通常是个坏主意。
  • 但这取决于要完成什么,这就是为什么第二个选项更有趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 2019-08-20
  • 2015-09-10
  • 1970-01-01
  • 2023-04-03
  • 2021-02-25
相关资源
最近更新 更多