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

Php 如果数组为空,则跳过foreach的最干净方法,php,coding-style,Php,Coding Style,这不是一个大问题,但我想知道是否有更干净的方法来做到这一点。最好避免用不必要的if语句嵌套代码。如果$items为空,php将抛出一个错误 $items = array('a','b','c'); if(!empty($items)) { // <-Remove this if statement foreach($items as $item) { print $item; } } $items=array('a','b','c'); 如果(!空($items)){/

这不是一个大问题,但我想知道是否有更干净的方法来做到这一点。最好避免用不必要的if语句嵌套代码。如果
$items
为空,php将抛出一个错误

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

if(!empty($items)) { // <-Remove this if statement
  foreach($items as $item) {
    print $item;
  }
}
$items=array('a','b','c');

如果(!空($items)){/我不建议抑制警告输出。但是,我建议使用
is_数组
而不是
!empty
。如果
$items
恰好是一个非零标量,那么如果使用
!empty
foreach
仍会出错

foreach((array)$items as $item) {}
第一种方法是继续通过foreach运行数组,假设您确实有一个数组

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

foreach ((array) $items as $item) {
    print $item;
}
注意:对于所有抱怨类型转换的人,请注意OP询问了一种最干净的方法,如果数组是空的,跳过foreach(重点是我的)。true、false、NUMBER或strings的值不被认为是空的。
此外,这将适用于实现
\Traversable
的对象,而
is\u array
则不起作用。

我认为最好的方法是规划代码,使$items始终是一个数组。最简单的解决方案是在代码顶部用$items=array()初始化它。这样,即使您没有给它赋值,它也将表示空数组

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

if(is_array($items)) {
  foreach($items as $item) {
    print $item;
  }
}

所有其他的解决方案对我来说都是肮脏的黑客。

我的“标准库”中有以下函数

基本上,这不需要处理数组/对象,也不需要将其他类型转换为数组

  foreach(a($whatever) as $item)....

  $foo = array_map(a($array_or_string)....

  etc

最好的方法是在使用前初始化每个变量。
它不仅能解决这个愚蠢的“问题”,还能帮你省下一大堆真正的麻烦


因此,引入$items作为
$items=array();
正是您真正想要的。

三元逻辑将其简化为一行,没有错误。这解决了不正确转换变量和未定义变量的问题

foreach (is_array($Items) || is_object($Items) ? $Items : array()  as $Item) {

写起来有点麻烦,但这是最安全的处理方法。

最佳做法是在代码的最顶端将变量定义为数组

foreach((数组)$myArr作为$oneItem){..}

也可以工作,但每次需要循环数组时都会复制此(数组)转换


因为即使是代码中的一个字也不要重复,所以最好在顶部将其定义为空数组。

您可以检查$items是否实际上是一个数组,以及它是否包含任何项:

if(is_array($items) && count($items) > 0)
{
    foreach($items as $item) { }
}

如果您需要的变量可能是
布尔值false
-例如,当数据库未返回任何记录时,或
数组
-当返回记录时,您可以执行以下操作:

foreach (($result ? $result : array()) as $item)
    echo $item;


使用cast(
(Array)$result
)的方法在变量为
boolean false
时生成计数1的数组,这可能不是您想要的。

什么?如果您只需注释掉
If
,并将第一行更改为
$items=Array()
,它工作得非常好,逻辑性也很强。你的问题肯定还有更多。是否
$items
可能不是数组?我猜它的case返回函数也可能返回false。我也有类似的问题,我总是检查using Is_arrayFYI-`foreach不支持使用“@”。`--因此,不,您不能对strager使用
@
+1。如果$items确实是一个数组,php不会给您错误或警告。请检查您的If/else分支,并确保您将变量初始化为数组。您可以使用来自不受信任函数的数据来发现这种情况。在这种情况下,If不是不必要的,甚至可以更好r/比其他一些解决方案更清晰、更难阅读。+1禁止警告和错误从来都不是一个好主意。我认为这是_uu[array]函数,这听起来仍然是一个糟糕的编程。让我解释一下为什么:为什么要求一个变量是数组?你应该知道这是一个数组,否则这意味着你弄乱了变量的类型。如果你的类型变得不一致,你就是在找麻烦。当你开始使用is_*函数时,它往往会分散到所有的变量r您的代码。毕竟,您永远不知道is_*是否必要,您的代码是否不可读。我建议您改为修复类型不一致的根源。@mathk您可能来自强类型语言。PHP变量可以存储任何内容,这就是为什么is_数组、is_数值等函数是必需的。这不会删除任何行,但代码更加自文档化,更易于阅读。+1这样,如果$items是数组,但为空,则foreach将不会运行,也不会出现错误。但为空()无法保证$items是否为数组,因此可能会出现错误,因为您最好先问一下为什么您得到的是null或object而不是数组。您假设类型不一致。然后将测试分散到所有代码中。这是一种防御性编程。这正是我想要的。如果变量不是数组,则循环不会正在运行。谢谢。@Keyo它会的。当$items时,它将抛出一个错误undefined@Keyo进行了一次编辑,描述了YCS的含义。只是一般不要这样做;)注意,当$items为false时,$items将获得array(false)当$items未定义时,我没有收到错误。这仅适用于旧版本吗?可能是新的PHP版本解决了这种情况吗?遗憾的是,这不起作用;PHP即使是一个正确的空数组也会生成此错误。它在运行时无法区分。@Chris Arguin为什么会这样?请在这里发布一个示例。它不应该在数组上抛出错误。有关详细信息,请参阅一个简单的例子;当我试图弄清楚为什么我的PHP代码在数组为空时失败时,偶然发现了这篇文章
foreach (($result ? $result : array()) as $item)
    echo $item;