这不是一个大问题,但我想知道是否有一个更干净的方法来做到这一点。最好避免使用不必要的 if 语句嵌套我的代码。如果 $items为空,php 将抛出错误。
$items
$items = array('a','b','c'); if(!empty($items)) { // <-Remove this if statement foreach($items as $item) { print $item; } }
我可能只需要使用“@”错误抑制器,但那样会有点不正常。
我不建议抑制警告输出。但是,我建议使用 is_array而不是 !empty。如果 $items碰巧是一个非零标量,那么如果您使用 !empty,那么 foreach仍然会出错。
is_array
!empty
foreach
foreach((array)$items as $item) {}
有无数种方法可以做到这一点。
第一个方法是继续前进,假设您有一个数组,那么无论如何都要在 foreach 中运行数组。
在其他情况下,您可能需要:
foreach ((array) $items as $item) { print $item; }
注意: 对于所有抱怨类型转换的人,请注意 OP 要求 如果 array 为 < strong > void,则跳过 foreach 的最干净的方法 (重点是我的)。True、 false、数字或字符串的值为 不被认为是空的。 另外,这种方法适用于实现 \Traversable的对象,而 is_array不适用。
\Traversable
$items = array('a','b','c'); if(is_array($items)) { foreach($items as $item) { print $item; } }
我认为这里最好的方法是规划代码,使 $item 始终是一个数组。最简单的解决方案是在代码顶部使用 $item = array ()初始化它。这样,即使您没有为它赋值,它也将表示空数组。
对我来说,所有其他的解决方案都是肮脏的手段。
在我的“标准库”中有以下函数
/// 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
最好的办法是 初始化所有该死的变量使用前。 它将不仅解决这个愚蠢的“问题”,而且还节省你的 真的头痛吨。
因此,引入 $item 作为 $items = array();是 真的想要的。
$items = array();
三元逻辑可以将其缩减为一行,而且没有错误。这解决了不正确转换变量和未定义变量的问题。
foreach (is_array($Items) || is_object($Items) ? $Items : array() as $Item) {
虽然写起来有点麻烦,但却是最安全的处理方式。
最佳实践是在代码的最顶端将变量定义为数组。
Foreach ((array) $myArr as $oneItem){ . . }
也将工作,但是每次需要通过数组循环时,都将复制此(数组)转换。
因为重要的是不要复制代码中的任何一个字,所以最好将其定义为顶部的空数组。
您可以检查 $item 是否实际上是一个数组,以及它是否包含任何项:
if(is_array($items) && count($items) > 0) { foreach($items as $item) { } }
如果您需要的变量可以是 boolean false-eg. 当数据库中没有返回记录时或 array-当记录被返回时,您可以执行以下操作:
boolean false
array
foreach (($result ? $result : array()) as $item) echo $item;
当变量为 boolean false时,强制类型转换((Array)$result)产生一个计数为1的数组,这可能不是您想要的。
(Array)$result