不是主要问题,但我想知道是否有更清洁的方法来做到这一点。最好避免使用不必要的if语句嵌套我的代码。如果$items
为空,则php会抛出错误。
$items = array('a','b','c');
if(!empty($items)) { // <-Remove this if statement
foreach($items as $item) {
print $item;
}
}
我可能只是使用'@'错误抑制器,但那会有点hacky。
答案 0 :(得分:184)
有一百万种方法可以做到这一点。
第一个是继续使用foreach运行数组,假设你有一个数组。
在其他情况下,您可能需要:
foreach ((array) $items as $item) {
print $item;
}
注意:对于所有抱怨类型转换的人,请注意,如果数组为空 ,则OP要求最简单的方法跳过foreach (重点是我的)。值true,false,数字或字符串不被视为空。
此外,这适用于实现\Traversable
的对象,而is_array
则不起作用。
答案 1 :(得分:26)
$items = array('a','b','c');
if(is_array($items)) {
foreach($items as $item) {
print $item;
}
}
答案 2 :(得分:24)
最好的方法是在使用前初始化每个血腥变量 它不仅可以解决这个愚蠢的“问题”,还能为您节省大量的真正的头痛。
所以,将$ item引入$items = array();
是真正想要的。
答案 3 :(得分:15)
我不建议禁止警告输出。不过,我建议使用is_array
代替!empty
。如果$items
恰好是非零标量,那么如果您使用foreach
,则!empty
仍会出错。
答案 4 :(得分:9)
如果您需要的变量可能是boolean false
- 例如。 当没有记录从数据库或array
- 返回记录时,您可以执行以下操作:
foreach (($result ? $result : array()) as $item)
echo $item;
使用强制转换((Array)$result
)的方法在变量为boolean false
时生成一个计数数组1,这不是你想要的。
答案 5 :(得分:6)
我认为这里最好的方法是计划代码,以便$ items始终是一个数组。最简单的解决方案是使用$ items = array()在代码顶部初始化它。这样,即使您没有为其指定任何值,它也将表示空数组。
对我来说,所有其他解决方案都非常糟糕。
答案 6 :(得分:4)
foreach((array)$items as $item) {}
答案 7 :(得分:3)
我的“标准库”中有以下功能
/// 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();
}
基本上,这对数组/对象没有任何作用,并将其他类型转换为数组。使用foreach语句和数组函数非常方便
foreach(a($whatever) as $item)....
$foo = array_map(a($array_or_string)....
etc
答案 8 :(得分:1)
三元逻辑将其降低到一行而没有错误。这解决了不正确地转换变量和未定义变量的问题。
foreach (is_array($Items) || is_object($Items) ? $Items : array() as $Item) {
写作有点痛苦,但却是最安全的处理方式。
答案 9 :(得分:0)
最佳做法是将变量定义为代码顶部的数组。
foreach((array)$ myArr as $ oneItem){..}
也可以工作,但每次需要遍历数组时,你都会复制这个(数组)转换。
因为重要的是不要复制代码中的一个单词,所以最好将它定义为顶部的空数组。
答案 10 :(得分:0)
您可以检查$ items是否实际上是一个数组,以及它是否包含任何项目:
if(is_array($items) && count($items) > 0)
{
foreach($items as $item) { }
}