PHP未定义索引/偏移解决方案

3

可能是重复的问题:
PHP:“Notice:Undefined variable”和“Notice:Undefined index”

最近我打开了错误提示,发现在我将值递增到新数组索引时出现了“Undefined Index”和“Undefined Offset”错误。

这里有一个非常基本的例子。

for($i = 0; $i<10; $i++)
{
    $arr['var1'] += $val1[$i];
    $arr['var2'] += $val2[$i];
}

在第一次迭代中,出现错误是因为$arr['var1']没有被设置。
我发现检查索引是否被设置以及在数组中使用isset()函数都可以解决这个问题。
if (!isset($arr['var1'])) {
    $arr['var1'] = 0;
}
$arr['var1'] += $val1[$i];

• 和 •

在增量for循环之前自动将索引设置为0可以避免错误消息。

我的问题是,我需要修复大约150个这样的问题,最好的方法是什么? 对每个变量进行isset检查,还是预先定义每个变量并将其值设置为0?


在PHP中尝试递增一个关联数组时出现“未定义索引”的通知 - mickmackusa
5个回答

4

你应该始终初始化变量。这是几乎所有语言中的最佳实践,访问未设置的变量被认为是极其糟糕的习惯。你应该始终在开发软件时处理错误。

你的代码应该如下:

$arr['var1'] = $arr['var2'] = 0;
for($i = 0; $i<10; $i++)
{
    $arr['var1'] += $val1[$i];
    $arr['var2'] += $val2[$i];
}

承担责任,修复所有150次出现的问题,然后从错误中吸取教训。下一次正确地编写代码。


1
这是个人偏好,因为两种选择都会产生相同的功能。然而,提前声明变量将节省一个条件和一个函数调用(这将在循环中重复出现),因此从效率的角度来看,在循环之前声明变量是最好的选择。通常,最佳实践是在使用变量之前声明它们。然而,PHP允许你逃避这样的事情,这就是为什么它不是必需的原因。

谢谢,我确实担心在增加时检查变量会降低效率。 - Jeremy A

1

先初始化,再迭代:

$arr['var1'] = 0;
$arr['var2'] = 0;
for($i = 0; $i<10; $i++)
{
    $arr['var1'] += $val1[$i];
    $arr['var2'] += $val2[$i];
}

这是更易读的代码 - 比你之前做的更好的实践。

如果你需要初始化一个包含多个计数器的数组,你可以像这样做:

$arr = array('counter1' => 0, 'counter2' => 0, 'counter3' => 0);

1
数组条目将在通过引用访问时自动生成(autovivification)。因此:
for($i = 0; $i < 10; $i++) {
    $var1 =& $arr['var1'];
    $var2 =& $arr['var2'];
    $var1 += $val1[$i];
    $var2 += $val2[$i];
}

甚至数组本身都不需要声明。默认情况下,新条目将具有值NULL,该值在添加时转换为0。


0

你应该修复这些区域,这是良好编程实践的要求。你采用的方法真的取决于你的代码。如果你真的在使用新变量,那么只需定义它们为假值、0、''或任何对于所涉及的变量来说都有意义的默认值。

如果你在代码中到达了一个可能已经设置了值或未设置值的地方(例如评估 $_POST 或 $_GET 数组),那么可以使用 isset()empty() 或类似函数来对其进行评估。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接