最清洁的方式来跳过一个foreach,如果数组是空的

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

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

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

有一百万种方法来做到这一点。

第一个将是继续前进,无论如何,通过foreach运行数组,假设你有一个数组。

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

 foreach((array)$items as $item) { print $item; } 

注意:对于所有投诉typecast的人,请注意, 如果数组是的,OP会要求最简洁的方法来跳过foreach (重点是我的)。 true,false,数字或string的值不认为是空的

 $items = array('a','b','c'); if(is_array($items))) { foreach($items as $item) { print $item; } } 

最好的方法是在使用前初始化每个血腥的variables
它不仅能解决这个愚蠢的“问题”,还能为你节省大量的真正头痛。

所以,引入$ items作为$items = array(); 是你真正想要的。

我不会推荐压制警告输出。 但是,我会推荐使用is_array而不是!empty 。 如果$items碰巧是一个非零的标量,那么如果使用!empty ,那么这个foreach仍然会出错。

如果variables你需要可以boolean false – 例如。 当数据库array 没有返回logging时返回logging时 ,可以执行以下操作:

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

使用cast( (Array)$result )的方法在variables为boolean false时产生一个count 1的数组,这不是你可能想要的。

我认为这里最好的办法是规划你的代码,使$ items总是一个数组。 最简单的解决scheme是使用$ items = array()在代码的顶部初始化它。 这样即使你不给它赋值,它也会代表空数组。

所有其他解决scheme对我来说是相当脏的黑客。

 foreach((array)$items as $item) {} 

我在我的“标准库”中有以下function

 /// Convert argument to an array. function a($a = null) { if(is_null($a)) return array(); if(is_array($a)) return $a; if(is_object($a)) return (array) $a; return $_ = func_get_args(); } 

基本上,这与数组/对象没有任何关系,并将其他types转换为数组。 这对于使用foreach语句和数组函数非常方便

  foreach(a($whatever) as $item).... $foo = array_map(a($array_or_string).... etc 

三元逻辑将其下降到一行,没有错误。 这解决了不正确地转换variables和未定义variables的问题。

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

写这是有点痛苦,但是处理它是最安全的方式。

最佳做法是将variables定义为代码最顶部的数组。

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

也可以工作,但是每当你需要遍历数组时,你将复制这个(数组)的转换。

因为重要的是不要复制你的代码,所以最好把它定义为一个空的数组。

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

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