我经常碰巧处理可以是数组或空变量的数据,并向这些数据提供foreach
。
$values = get_values();
foreach ($values as $value){
...
}
当您使用非数组的数据提供foreach时,会收到警告:
警告:[...]
中为foreach()提供的参数无效
假设不可能重构get_values()
函数以始终返回数组(向后兼容,不可用的源代码,无论其他原因),我想知道哪种方法是最简洁,最有效的方法来避免这些警告:
$values
投射到数组$values
初始化为数组foreach
if
答案 0 :(得分:457)
就我个人而言,我发现这是最干净的 - 不确定它是否最有效,请注意!
if (is_array($values) || is_object($values))
{
foreach ($values as $value)
{
...
}
}
我偏好的原因是,当你什么都没有开始时,它不会分配一个空数组。
答案 1 :(得分:92)
这个怎么样?更清洁,所有人都是单线。
foreach ((array) $items as $item) {
// ...
}
答案 2 :(得分:40)
我通常使用类似于此的构造:
/**
* Determine if a variable is iterable. i.e. 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...
}
}
请注意,此特定版本未经过测试,直接从内存中输入。
修改:添加了Traversable支票
答案 3 :(得分:13)
请不要依赖于投射作为解决方案, 即使其他人建议将此作为防止错误的有效选项,也可能会导致另一个错误。
请注意:如果您希望返回特定形式的数组,则可能会失败。需要进行更多检查。
E.g。将一个布尔值转换为数组
(array)bool
, NOT 会产生一个空数组,但是一个数组包含一个包含布尔值的元素作为int:[0=>0]
或{{1 }}
I wrote a quick test to present this problem。 (如果第一个测试网址失败,这里是backup Test。)
包括:[0=>1]
,null
,false
,true
,class
和array
的测试。
在foreach中使用之前,请始终测试您的输入。建议:
undefined
$array = is_array($var) or is_object($var) ? $var : [] ;
块try{}catch(){}
。答案 4 :(得分:8)
试试这个:
//Force array
$dataArr = is_array($dataArr) ? $dataArr : array($dataArr);
foreach ($dataArr as $val) {
echo $val;
}
)
答案 5 :(得分:4)
$values = get_values();
foreach ((array) $values as $value){
...
}
问题始终为空,而铸造实际上是清洁解决方案。
答案 6 :(得分:3)
首先,必须初始化每个变量。始终。
铸造不是一种选择。
如果get_values();可以返回不同的类型变量,当然必须检查这个值。
答案 7 :(得分:3)
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; ?>
答案 8 :(得分:2)
foreach ($arr ? $arr : [] as $elem) {
// Does something
}
这个doesen不检查它是否是一个数组,但如果该变量为null或为空数组,则跳过循环。
答案 9 :(得分:2)
如果您使用的是php7并且只想处理未定义的错误,那么这是最干净的恕我直言
$array = [1,2,3,4];
foreach ( $array ?? [] as $item ) {
echo $item;
}
答案 10 :(得分:1)
我不确定是否是这种情况但是这个问题似乎在迁移wordpress网站或迁移动态网站时多次发生。如果是这种情况,请确保您要迁移的托管使用与旧站点相同的PHP版本。
如果您没有迁移您的网站,这只是一个问题,请尝试更新到PHP 5.这会解决其中的一些问题。可能看起来像一个愚蠢的解决方案,但对我来说是诀窍。
答案 11 :(得分:1)
如果在foreach循环
中将数组设置为null,则会出现此通知的特殊情况if (is_array($values))
{
foreach ($values as $value)
{
$values = null;//WARNING!!!
}
}
答案 12 :(得分:1)
这个解决方案怎么样:
$type = gettype($your_iteratable);
$types = array(
'array',
'object'
);
if (in_array($type, $types)) {
// foreach code comes here
}
答案 13 :(得分:0)
为foreach()提供的警告无效参数显示推文。 去&#34; / wp-content / plugins / display-tweets-php&#34;。 然后在第591行插入此代码,它将完美运行。
if (is_array($tweets)){
foreach ( $tweets as $tweet )
{
...
}
}
答案 14 :(得分:0)
似乎与环境有关:
我有“无效参数提供foreach()”错误仅在开发环境中,但不是在prod中(我在服务器上工作,而不是localhost)。
尽管出现错误,但var_dump表明数组在那里很好(在app和dev两种情况下)。
if (is_array($array))
周围的foreach ($array as $subarray)
解决了这个问题。
对不起,我无法解释原因,但由于我花了一段时间才想出一个解决方案,我想更好地分享这个作为观察。
答案 15 :(得分:0)
我将使用empty,isset和is_array的组合作为
$array = ['dog', 'cat', 'lion'];
if(!empty($array) && isset($array) && is_array($array){
//loop
foreach ($array as $values) {
echo $values;
}
}
答案 16 :(得分:0)
使用is_array函数,将数组传递给foreach循环。
if (is_array($your_variable)) {
foreach ($your_variable as $item) {
//your code
}
}
答案 17 :(得分:0)
如果get_value()
为空,将一个空数组定义为后备该怎么办?
我想不出最短的方法。
$values = get_values() ?: [];
foreach ($values as $value){
...
}
答案 18 :(得分:-3)
我会和Andy做同样的事情,但我会使用'空'功能。
像这样: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
}
}