最清洁的方式来跳过一个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) { } }