【问题标题】:PHP Undefined Index / Undefined Offset work arounds [duplicate]PHP未定义索引/未定义偏移解决方法[重复]
【发布时间】:2012-08-15 23:04:36
【问题描述】:

可能重复:
PHP: “Notice: Undefined variable” and “Notice: Undefined index”

最近打开了错误,我在递增到新数组索引的行上发现了未定义索引和未定义偏移错误。

这是一个非常基本的例子。

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

我收到错误是因为在第一次迭代时没有设置 $arr['var1']。

我发现两者都检查索引是否设置

if (!isset($arr['var1'])) {
    $arr['var1'] = 0;
}
$arr['var1'] += $val1[$i];

• 和 •

在递增的 forloop 之前自动将索引设置为 0 会停止错误消息。

我的问题是我要解决其中的大约 150 个问题,解决此问题的最佳方法是什么。 检查每一个 isset,还是预先定义每一个 val 为 0?

【问题讨论】:

    标签: increment php


    【解决方案1】:

    您应该始终初始化您的变量。这绝对是几乎所有语言的最佳实践,访问未设置的变量被认为是一种极坏的习惯。您应该始终在开发有错误的软件on

    您的代码应为:

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

    接受打击,修复所有 150 次出现的此问题,然后从错误中吸取教训。下次正确写代码。

    【讨论】:

    • 应该更清楚,谢谢。
    【解决方案2】:

    这是个人喜好,因为任何一种选择都会产生相同的功能。但是,提前声明它将为您节省条件调用和函数调用(将在循环中重复),因此从效率的角度来看,最好在循环之前声明它。通常,最佳实践是在使用变量之前声明它们。然而,PHP 可以让你摆脱这样的事情,这就是为什么它不是必需的。

    【讨论】:

    • 谢谢,我确实担心在递增时检查 var 会降低效率。
    【解决方案3】:

    先初始化,再迭代:

    $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);
    

    【讨论】:

    • 同意,这比增量检查更具可读性
    【解决方案4】:

    如果您通过引用访问它们,则数组条目将产生(自动激活)。因此:

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

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

    【讨论】:

    • 太棒了!这就是我正在寻找的优化!谢谢。
    【解决方案5】:

    您应该修复这些区域,只是为了良好的编码习惯。您采用的方法实际上取决于您的代码。如果您真的在使用新变量,那么只需将它们定义为 false、0、'' 或任何有意义的值作为相关变量的默认值。

    如果您在代码中的某个位置可能有或没有值集(例如评估 $_POST 或 $_GET 数组),则使用 isset()empty() 或类似方法来评估它。

    【讨论】:

    • 谢谢 Mike,没有考虑过 POST 和 GET 变量。
    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2013-05-22
    • 1970-01-01
    相关资源
    最近更新 更多