php foreach no velue_php - 为foreach()提供的参数无效

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值