php - 为foreach()提供的参数无效
我经常碰巧处理可以是数组或空变量的数据,并用这些数据提供一些foreach。
$values = get_values();
foreach ($values as $value){
...
}
当您使用非数组的数据提供foreach时,您会收到警告:
警告:在[...]中为foreach()提供的参数无效
假设不可能重构foreach函数以始终返回一个数组(向后兼容,不可用的源代码,无论其他原因),我想知道哪种方法是最清洁,最有效的方法来避免这些警告:
将foreach转换为数组
将数据初始化为foreach
用if包装foreach
其他(请建议)
Roberto Aloi asked 2019-02-19T08:02:56Z
18个解决方案
432 votes
我个人认为这是最干净的 - 不确定它是否是最有效的,介意!
if (is_array($values) || is_object($values))
{
foreach ($values as $value)
{
...
}
}
我偏好的原因是,当你无论如何都没有任何东西时,它不会分配一个空数组。
Andy Shellam answered 2019-02-19T08:03:14Z
78 votes
这个怎么样? 更清洁,所有在一条线。
foreach ((array) $items as $item) {
// ...
}
Ajith R Nair answered 2019-02-19T08:03:39Z
38 votes
我通常使用类似于这样的结构:
/**
* 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...
}
}
请注意,此特定版本未经过测试,直接从内存中输入SO。
编辑:添加了Traversable检查
Kris answered 2019-02-19T08:04:18Z
13 votes
请不要依赖铸造作为解决方案,尽管其他人建议将此作为防止错误的有效选项,但它可能会导致另一个错误。
请注意:如果您希望返回特定形式的数组,则可能会失败。 需要更多检查。
例如。 将一个布尔值转换为数组try{}catch(){},不会产生一个空数组,而是一个数组,其中一个元素包含一个布尔值为int:false或true。
我写了一个快速测试来介绍这个问题。(如果第一个测试网址失败,这是备份测试。)
包括的测试:try{}catch(){},false,true,class,array和undefined。
在foreach中使用之前,请务必测试您的输入。建议:
快速类型检查:try{}catch(){}
在使用foreach并指定返回类型之前,在方法中键入提示数组
在fore中包装foreach
使用try{}catch(){}块
在生产发布之前设计适当的代码/测试
要以正确的形式测试数组,您可以在特定键上使用array_key_exists,或者测试数组的深度(当它是1时!)。
始终以减少重复代码的方式将辅助方法提取到全局命名空间中
AARTT answered 2019-02-19T08:06:17Z
6 votes
试试这个:
//Force array
$dataArr = is_array($dataArr) ? $dataArr : array($dataArr);
foreach ($dataArr as $val) {
echo $val;
}
;)
GigolNet Guigolachvili answered 2019-02-19T08:06:41Z
4 votes
$values = get_values();
foreach ((array) $values as $value){
...
}
问题始终为空,而铸造实际上是清洁解决方案。
boctulus answered 2019-02-19T08:07:09Z
3 votes
首先,必须初始化每个变量。 总是。
铸造不是一种选择。
如果get_values(); 可以返回不同的类型变量,当然必须检查此值。
Your Common Sense answered 2019-02-19T08:08:13Z
3 votes
更简洁的@Kris代码扩展
function secure_iterable($var)
{
return is_iterable($var) ? $var : array();
}
foreach (secure_iterable($values) as $value)
{
//do stuff...
}
特别是对于使用内部模板代码
...
HongKilDong answered 2019-02-19T08:08:47Z
2 votes
foreach ($arr ? $arr : [] as $elem) {
// Does something
}
这不会检查它是否是数组,但如果变量为null或空数组则跳过循环。
T30 answered 2019-02-19T08:09:14Z
2 votes
如果你正在使用php7并且你只想处理未定义的错误,这是最干净的恕我直言
$array = [1,2,3,4];
foreach ( $array ?? [] as $item ) {
echo $item;
}
Edwin Rodríguez answered 2019-02-19T08:09:42Z
1 votes
我不确定是否是这种情况但是这个问题似乎在迁移wordpress站点或迁移动态站点时会发生很多次。 如果是这种情况,请确保您要迁移的托管使用您的旧网站使用的相同PHP版本。
如果您没有迁移您的站点,这只是一个问题,请尝试更新到PHP 5.这会解决其中的一些问题。 可能看起来像一个愚蠢的解决方案,但对我来说是诀窍。
Erik answered 2019-02-19T08:10:18Z
1 votes
如果在foreach循环中将数组设置为null,则会出现此通知的特殊情况
if (is_array($values))
{
foreach ($values as $value)
{
$values = null;//WARNING!!!
}
}
Farid Movsumov answered 2019-02-19T08:10:46Z
1 votes
这个解决方案怎么样:
$type = gettype($your_iteratable);
$types = array(
'array',
'object'
);
if (in_array($type, $types)) {
// foreach code comes here
}
Julian answered 2019-02-19T08:11:08Z
0 votes
似乎也与环境有关:
我只有在开发环境中才有“无效参数提供foreach()”错误,但在prod中没有(我在服务器上工作,而不是localhost)。
尽管出现错误,但var_dump表明阵列很好(在app和dev两种情况下)。
if (is_array($array))左右的if (is_array($array))解决了这个问题。
对不起,我无法解释原因,但由于我花了一段时间才找到解决方案,我想更好地分享这个作为观察。
araldh answered 2019-02-19T08:12:10Z
0 votes
我将使用empty,isset和is_array的组合作为
$array = ['dog', 'cat', 'lion'];
if(!empty($array) && isset($array) && is_array($array){
//loop
foreach ($array as $values) {
echo $values;
}
}
Akintunde-Rotimi answered 2019-02-19T08:12:39Z
0 votes
使用is_array函数,将数组传递给foreach循环。
if (is_array($your_variable)) {
foreach ($your_variable as $item) {
//your code
}
}
Super Model answered 2019-02-19T08:13:07Z
0 votes
为foreach()提供的警告无效参数显示推文。转到“/ wp-content / plugins / display-tweets-php”。然后在第591行插入此代码,它将完美运行。
if (is_array($tweets)){
foreach ( $tweets as $tweet )
{
...
}
}
Saad Khanani answered 2019-02-19T08:13:39Z
-3 votes
我会做与安迪相同的事情,但我会使用'空'功能。
像这样:
if(empty($yourArray))
{echo"
There's nothing in the array.....
";}else
{
foreach ($yourArray as $current_array_item)
{
//do something with the current array item here
}
}
as_bold_as_love answered 2019-02-19T08:14:11Z