为了账号安全,请及时绑定邮箱和手机立即绑定

为foreach()提供的无效参数

为foreach()提供的无效参数

PHP
翻翻过去那场雪 2019-06-03 10:11:40
为foreach()提供的无效参数我经常遇到这样的情况:处理数据,这些数据既可以是数组,也可以是空变量,并提供一些foreach用这些数据。$values = get_values();foreach ($values as $value){   ...}当您用非数组的数据填充外汇时,您会得到一个警告:警告:为[.]中的foreach()提供的无效参数假设不可能重构get_values()函数要始终返回数组(向后兼容性,而不是可用的源代码,无论其他原因如何),我想知道哪种方法是避免这些警告的最干净和最有效的方法:铸造$values数组初始化$values数组包扎foreach带着if其他(请建议)
查看完整描述

4 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

就我个人而言,我发现这是最干净的-不确定这是否是最有效的,头脑!

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

我选择的原因是,当您开始没有什么东西的时候,它不会分配空数组。


查看完整回答
反对 回复 2019-06-03
?
郎朗坤

TA贡献1921条经验 获得超9个赞

这个怎么样?很多清洁剂和所有的单线。

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


查看完整回答
反对 回复 2019-06-03
?
largeQ

TA贡献2039条经验 获得超7个赞

请不要依赖铸造作为解决方案。尽管其他人认为这是防止错误的有效选项,但它可能会导致另一个错误。

注意:如果您期望返回特定形式的数组,则可能会失败。这需要更多的检查。

例如:将布尔值转换为数组(array)bool威尔结果是一个空数组,但是一个包含布尔值作为int的元素的数组:[0=>0][0=>1].

我写了一个快速测试来提出这个问题。..(这里有一个备份测试如果第一个测试url失败了。)

包括对以下方面的测试:nullfalsetrue..class..arrayundefined.


在使用之前,一定要测试您的输入。建议:

  1. 快速类型检查$array = is_array($var) or is_object($var) ? $var : [] ;

  2. 类型暗示阵列

    在使用foreach和

    指定返回类型

  3. 包扎
  4. 使用

    try{}catch(){}

    砌块
  5. 在产品发布前设计适当的代码/测试
  6. 要根据适当的格式测试数组,可以使用

    array_key_exists

    在特定的钥匙上,

    或者测试数组的深度(当它是一个!).

  7. 始终将助手方法解压缩到全局命名空间中,以减少重复代码。


查看完整回答
反对 回复 2019-06-03
  • 4 回答
  • 0 关注
  • 1268 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信