为foreach()提供的参数无效

我经常碰巧处理的数据可以是一个数组,也可以是一个空variables,并用这些数据提供一些foreach数据。

 $values = get_values(); foreach ($values as $value){ ... } 

当您使用不是数组的数据提供foreach时,会收到警告:

警告:为foreach()提供的无效参数[…]

假设无法重构get_values()函数总是返回一个数组(向下兼容性,不可用的源代码,无论其他原因),我想知道哪个是最干净和最有效的方法来避免这些警告:

  • $values投射到数组
  • $values初始化为数组
  • if包装foreach
  • 其他(请build议)

我个人认为这是最清洁的 – 不知道它是否是最有效率的,头脑!

 if (is_array($values) || is_object($values)) { foreach ($values as $value) { ... } } 

我的偏好的原因是,它不会分配一个空的数组,当你没有任何开始。

这个怎么样? 很多清洁剂和所有在一条线。

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

我通常使用类似于这样的构造:

 /** * Determine if a variable is iterable. ie can be used to loop over. * * @return bool */ function is_iterable($var) { return $var !== null && (is_array($var) || $var instanceof Traversable || $var instanceof Iterator || $var instanceof IteratorAggregate ); } $values = get_values(); if (is_iterable($values)) { foreach ($values as $value) { // do stuff... } } 

请注意,这个特定的版本没有经过testing,它直接从内存中input到SO中。

编辑:添加Traversable检查

尽pipe其他人认为这是防止错误的有效select,但请不要依赖于解决scheme ,否则可能会导致另一个问题。

请注意:如果您希望返回一个特定的数组forms,这可能会使您失败。 更多的检查是必需的。

例如,将一个布尔值转换为一个数组(array)bool ,将不会产生一个空数组,而是一个包含布尔值的元素作为int: [0=>0][0=>1]的数组。

我写了一个快速testing来解决这个问题 。 (这是第一个testingurl失败时的备份testing 。)

包括testing: nullfalsetrue ,一个class ,一个arrayundefined


在使用foreach之前,请始终testing您的input。 build议:

  1. 快速types检查 : $array = is_array($var) or is_object($var) ? $var : [] ; $array = is_array($var) or is_object($var) ? $var : [] ;
  2. 在使用foreach和指定返回types之前,在方法中键入提示数组
  3. 在if中包装foreach
  4. 使用try{}catch(){}
  5. 在生产发布之前devise正确的代码/testing
  6. 为了以适当的formstesting一个数组,你可以在一个特定的键上使用array_key_exists , 或者testing一个数组的深度(当它是一个!) 。
  7. 总是把你的帮助器方法提取到全局命名空间中,以减less重复的代码

尝试这个:

 //Force array $dataArr = is_array($dataArr) ? $dataArr : array($dataArr); foreach ($dataArr as $val) { echo $val; } 

;)

 $values = get_values(); foreach ((array) $values as $value){ ... } 

问题总是空的,Casting实际上是清洁解决scheme。

首先,每个variables都必须被初始化。 总是。
铸造不是一个选项。
如果get_values(); 可以返回不同types的variables,当然这个值必须被检查。

@ Kris代码的更简洁的扩展

 function secure_iterable($var) { return is_iterable($var) ? $var : array(); } foreach (secure_iterable($values) as $value) { //do stuff... } 

尤其是对于使用内部模板代码

 <?php foreach (secure_iterable($values) as $value): ?> ... <?php endforeach; ?> 
 foreach ($arr ? $arr : [] as $elem) { // Does something } 

这doesen't检查,如果它是一个数组,但跳过循环,如果variables为null或一个空的数组。

如果您使用的是php7,而您只想处理未定义的错误,那么这是最干净的恕我直言

 $array = [1,2,3,4]; foreach ( $array ?? [] as $item ) { echo $item; } 

我不确定是否是这种情况,但是这个问题似乎在迁移wordpress站点或迁移dynamic站点时会出现很多次。 如果是这种情况,请确保您正在迁移的主机使用您的旧网站使用的相同的PHP版本。

如果你没有迁移你的网站,这只是一个已经出现的问题,请尝试更新到PHP 5.这需要处理其中的一些问题。 可能看起来像一个愚蠢的解决scheme,但为我做了诡计。

如果在foreach循环中将数组设置为null,则会发生此通知的特例

 if (is_array($values)) { foreach ($values as $value) { $values = null;//WARNING!!! } } 

似乎也有一个与环境的关系:

我有这个“无效的参数提供foreach()”错误只在开发环境,但不是在prod(我正在服务器上,而不是本地主机)。

尽pipe发生错误,var_dump表示该数组在那里(在这两种情况下的应用程序和开发)。

foreach ($array as $subarray)if (is_array($array)) foreach ($array as $subarray)解决了这个问题。

对不起,我无法解释原因,但是花了一段时间才找出解决办法,我认为更好的分享这个观察。

警告为foreach()提供的无效参数显示tweets。 去 。 /可湿性粉剂内容/插件/显示鸣叫的PHP

在线号码591插入这个coad。它将完美运行

 if (is_array($tweets)){ foreach ( $tweets as $tweet ) { ... } } 

我将使用空,isset和is_array的组合

 $array = ['dog', 'cat', 'lion']; if(!empty($array) && isset($array) && is_array($array){ //loop foreach ($array as $values) { echo $values; } } 

使用is_array函数,当你将数组传递给foreach循环。

 if (is_array($your_variable)) { foreach ($your_variable as $item) { //your code } } 

这个解决scheme如何:

 $type = gettype($your_iteratable); $types = array( 'array', 'object' ); if (in_array($type, $types)) { // foreach code comes here } 

我会做同样的事情安迪,但我会使用'空'function。

像这样:

 if(empty($yourArray)) {echo"<p>There's nothing in the array.....</p>";} else { foreach ($yourArray as $current_array_item) { //do something with the current array item here } }