为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: null
, false
, true
,一个class
,一个array
和undefined
。
在使用foreach之前,请始终testing您的input。 build议:
- 快速types检查 :
$array = is_array($var) or is_object($var) ? $var : [] ;
$array = is_array($var) or is_object($var) ? $var : [] ;
- 在使用foreach和指定返回types之前,在方法中键入提示数组
- 在if中包装foreach
- 使用
try{}catch(){}
块 - 在生产发布之前devise正确的代码/testing
- 为了以适当的formstesting一个数组,你可以在一个特定的键上使用
array_key_exists
, 或者testing一个数组的深度(当它是一个!) 。 - 总是把你的帮助器方法提取到全局命名空间中,以减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 } }