【问题标题】:Undefined offset in for loopfor循环中未定义的偏移量
【发布时间】:2015-05-03 12:56:21
【问题描述】:

我通常这样写我的 for 循环:

for ($i=0; $list[$i]; $i++)

但今天我开始收到警告:

注意:未定义的偏移量:5`

该数组有 5 个元素长,所以我知道为什么会得到它,但奇怪的是我以前从未编写过这样的循环出错。即使在这台服务器上(或者我认为)。

我知道如何解决它,通过这样做

$ct = count($list);
for ($i=0; $i < $ct; $i++) 

但这不是重点;我想知道为什么会这样。

我以前的服务器是否都关闭了错误报告,而这台服务器开启了它,而我之前从未注意到它?

多年来,我一直在写这样的for 循环,所以这似乎是我会注意到的。它是 PHP 的最新更新吗?

【问题讨论】:

  • 我可能猜想所有其他服务器都关闭了错误报告(当您的服务器不在登台时这是正常的)。第二个代码块是您如何正确执行或使用 foreach 循环!
  • 你应该改用foreach
  • 你不应该使用这个。如果$list[$i] 包含布尔值false,即使有更多项目,循环也会停止。
  • 为什么人们喜欢做这么难的事情真是太奇怪了。这绝对是数据依赖循环
  • 我知道这些缺点,如果应用其中任何一个,我不会使用它。

标签: php arrays for-loop


【解决方案1】:

首先,您的数组可以包含乱序键,甚至不包含数字键,例如,array(0 =&gt; 'a', 2 =&gt; 'b') 没有 1 偏移量,因此当您尝试使用 for 循环遍历它时,它会看起来对于第二次迭代中的1 偏移量($i = 1),从而导致通知(在这种情况下它永远不会达到2 偏移量——又一个缺点) .

其次,$list[$i] 可以包含nullfalse00.0"0"'0'''"" 或@9876543 987654338@ 并导致循环中断(虽然它不会发出通知,但代表了这种方法不好的原因)。

您应该使用foreach 循环而不是for 或使用array_values() 重新索引您的数组(实际上它会返回一个新的),然后再使用for 循环遍历它。

【讨论】:

  • 我不认为这是乱序键,但这是一个好点。
  • @felwithe:底线是:您没有 for 循环在您的数组中提供的密钥。要么您的通知之前被关闭,要么您只是幸运(我们同意这可能是第一个),但无论如何这是一个不好的做法。
  • 在 Perl 中很常见;归根结底,我只是想检查是否存在数组索引。我猜通知被关闭了,因为错误肯定不是,对于 12+ 我一直在使用它。这就是为什么我认为这一定是最近的变化,但我猜是一连串很长的巧合导致我从未遇到过这个通知。
【解决方案2】:

我遇到了同样的错误,但我注意到数组中不存在某些键/索引(来自循环的变量)。

我通过检查循环提供的键/索引是否存在于数组中来解决它。 我使用了这个函数array_key_exists(array_key, array_name)check here,它对我有用。 这主要是在您不需要重新索引数组时完成。

例如

for($i = 0;$i <$max; $i++) {
     if(array_key_exists($i, $array_name)){
        // if exists do something....
    }else{
      // if not exists
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多