PHP速记加法运算符 - 未定义的偏移量

时间:2011-11-15 06:36:47

标签: php arrays foreach operators

我正在使用PHP简写加法运算符来计算特定id在多维数组中出现的次数:

$source['tally'] = array();

foreach ($items as $item) {
    $source['tally'][$item->getId()] += 1;
}

第一次点击新ID时,它会将“tally”值设置为1,然后在每次发现后将其递增。

代码完美运行(我得到了正确的总数),但每次找到新的id时,PHP都会给我一个“Undefined Offset”通知。

我知道我可以在php.ini中关闭通知,但我认为必须有一个原因让PHP不赞成我的技术。

像这样动态创建一个新的键/偏移量被认为是不好的做法,我应该采取更好的方法吗?

请注意:为了帮助澄清以下初步反馈,我明白为什么要发出通知。我的问题是我是否应该对此采取任何措施或只是接受通知。如果我的问题不够明确,请道歉。

4 个答案:

答案 0 :(得分:3)

您必须了解PHP通知是工具。它们存在,因此您在编写代码时可以获得额外的帮助,并且您可以轻松地检测到潜在的错误。未初始化的变量是典型的例子。许多开发人员问:如果初始化变量不是强制性的,为什么PHP会抱怨?因为它试图提供帮助:

$item_count = 0;
while( do_some_stuff() ){
     $iten_count++; // Notice: Undefined variable: iten_count
}
echo $item_count . ' items found';

哎呀,我错误输入了变量名。

$res = mysql_query('SELECT * FROM foo WHERE foo_id=' . (int)$_GET['foo_id']);
// Notice: Undefined index: foo_id

哎呀,我还没有提供默认值。

你的只是​​同样情况的另一个例子。如果你正在增加错误的数组元素,那么你想知道。

答案 1 :(得分:1)

使用+=(或任何其他扩充赋值运算符)假定该键已存在一个值。由于第一次遇到ID时不是这种情况,因此会发出通知并假定为0

答案 2 :(得分:1)

如果您只想隐藏通知,可以使用error control operator

$source['tally'] = array();

foreach ($items as $item) {
    @$source['tally'][$item->getId()]++;
}

但是,通常应该初始化变量,在这种情况下,通过在循环中添加以下代码:

if (!isset( $source['tally'][$item->getId()] ))
{
   $source['tally'][$item->getId()] = 0;
}

答案 3 :(得分:1)

这是因为您没有初始化数组以包​​含初始值0。请注意,代码可能会起作用,但是初始化您要执行操作的所有变量被认为是一种好习惯。因此,以下代码是您应该拥有的示例:

<?php
    $source['tally'] = array();

    foreach ($items as $item) {
        //For each $item in $items,
        //check if that item doesn't exist and create it (0 times).
        //Then, regardless of the previous statement, increase it by one.
        if (!isset($source['tally'][$item->getID()]) $source['tally'][$item->getID()] = 0;
        $source['tally'][$item->getId()] += 1;
    }
?>

PHP关心它的实际原因主要是警告你那个空值(就像你试图读它一样)。这是一种错误,不是致命的,破坏脚本的错误,而是一种更微妙的安静。你应该仍然修复它。