我正在使用PHP简写加法运算符来计算特定id在多维数组中出现的次数:
$source['tally'] = array();
foreach ($items as $item) {
$source['tally'][$item->getId()] += 1;
}
第一次点击新ID时,它会将“tally”值设置为1,然后在每次发现后将其递增。
代码完美运行(我得到了正确的总数),但每次找到新的id时,PHP都会给我一个“Undefined Offset”通知。
我知道我可以在php.ini中关闭通知,但我认为必须有一个原因让PHP不赞成我的技术。
像这样动态创建一个新的键/偏移量被认为是不好的做法,我应该采取更好的方法吗?
请注意:为了帮助澄清以下初步反馈,我明白为什么要发出通知。我的问题是我是否应该对此采取任何措施或只是接受通知。如果我的问题不够明确,请道歉。
答案 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关心它的实际原因主要是警告你那个空值(就像你试图读它一样)。这是一种错误,不是致命的,破坏脚本的错误,而是一种更微妙的安静。你应该仍然修复它。