如果数组为空,则跳过foreach的最干净的方法

Key*_*eyo 115 php coding-style

这不是一个主要问题,但我想知道是否有更清洁的方法来做到这一点.最好避免使用不必要的if语句嵌套我的代码.如果$items是空的php会抛出错误.

$items = array('a','b','c');

if(!empty($items)) { // <-Remove this if statement
  foreach($items as $item) {
    print $item;
  }
}
Run Code Online (Sandbox Code Playgroud)

我可能只是使用'@'错误抑制器,但这有点hacky.

Chr*_*ian 195

有一百万种方法可以做到这一点.

假设你有一个数组,那么第一个就是继续运行数组通过foreach.

在其他情况下,这是您可能需要的:

foreach ((array) $items as $item) {
    print $item;
}
Run Code Online (Sandbox Code Playgroud)

注意:对于所有抱怨类型转换的人,请注意OP 如果数组为,则要求最简洁的方法跳过foreach(重点是我的).值true,false,数字或字符串不被视为空.此外,这将适用于实现对象\Traversable,is_array但不起作用.

  • 注意,当$ items为false时.(数组)$ items将获取数组(false) (9认同)
  • @Keyo会的.$ item未定义时会抛出错误 (4认同)
  • 正是我想要的。如果变量不是数组,则不会运行循环。谢谢。 (2认同)

Mat*_*son 26

$items = array('a','b','c');

if(is_array($items)) {
  foreach($items as $item) {
    print $item;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 以这种方式+1,如果$ items是数组但是为空,foreach将不会运行并且不会出现错误.但是empty()不保证$ items是否为数组,因此可能出错 (5认同)
  • 这不会删除任何行,但代码更自我记录并且更易于阅读. (4认同)

You*_*nse 26

最好的方法是在使用前初始化每个血腥变量.
它不仅解决了这个愚蠢的"问题",但也为你节省大量的真正的头痛.

所以,引入$ items $items = array();就是你真正想要的.

  • `get_stuff()`可能来自外部API.库函数返回"Array | NULL"并不罕见 (6认同)
  • 不是从函数/方法初始化.`$ items = get_stuff()`.转换和伪变量返回空数组更容易. (3认同)
  • 甚至 php 自己的函数也会返回不同的类型。假设您通过网络请求一些 JSON 数组。您知道生成的 JSON 始终是一个数组。那么 json_decode() 总是返回一个数组?不会。可能会出现网络超时,接收到的 JSON 不完整,json_decode 将返回 NULL。这不是编造的,它是取自 piwik(一个流行的分析脚本)最近的错误的现实生活示例:https://github.com/piwik/piwik/pull/11098 根据您的回答,解决方案是更改php 的 json_decode()? (3认同)
  • @YourCommonSense 你的答案在哪里进行验证?验证意味着例如检查 json_decode() 返回的是否是一个数组,这正是 Matt Williamson 的答案。 (3认同)

Zac*_*ner 15

我不建议抑制警告输出.但是,我建议使用is_array而不是!empty.如果$items恰好是非零标量,那么foreach如果你使用它仍然会出错!empty.

  • +1压制警告和错误绝不是一个好主意. (9认同)
  • 我讨论了is_ [array]函数,这听起来还算糟糕.让我解释一下原因:为什么要求变量是一个数组?您应该知道这是一个数组,否则就意味着您正在弄乱变量的类型.如果您的类型变得不一致,那么您正在寻找麻烦.当你开始使用is_*函数时,它往往遍布你的代码.毕竟你永远都不知道is_*是否必要且你的代码是不可读的.我建议你修改类型不一致的起源. (3认同)
  • @mathk你可能来自强类型语言。PHP 变量可以存储任何内容,这就是为什么 is_array、is_numeric 等是需要的函数。 (2认同)

Dan*_*mak 9

如果您需要的变量可能是boolean false- 例如.当没有从数据库返回记录时array - 或者当返回记录时,您可以执行以下操作:

foreach (($result ? $result : array()) as $item)
    echo $item;
Run Code Online (Sandbox Code Playgroud)

(Array)$result当变量boolean false不是你想要的那样时,使用cast()的方法会产生一个count数组.

  • 当通过引用分配时,这会产生语法错误,如“foreach...as &amp;$item”,因为当 $result 为 null 时,它无法分配对“array()”的引用。请参阅:http://php.net/manual/en/control-structs.foreach.php (2认同)
  • 从 PHP 5.3 开始,可以省略三元运算符的中间部分。所以它可能会变成`foreach (($result ?: array()) as $item)`。如果`$result`可能是`null`,那么 php 7 引入了`null合并运算符``foreach (($result ?? array()) as $item)`。请参阅 https://www.php.net/manual/en/language.operators.comparison.php (2认同)

Vla*_*sny 6

我认为这里最好的方法是规划你的代码,以便$ items总是一个数组.最简单的解决方案是使用$ items = array()在代码顶部初始化它.这样,即使您没有为其分配任何值,它也将表示空数组.

所有其他解决方案对我来说都非常糟糕.


Mil*_*lan 5

foreach((array)$items as $item) {}
Run Code Online (Sandbox Code Playgroud)