PHP:foreach循环中的错误是什么?

PHP:foreach循环中的错误是什么?,php,arrays,foreach,increment,Php,Arrays,Foreach,Increment,我试图避免使用array\u count\u值(太慢)来计算出现次数,所以我使用foreach循环,但是我一直在下面得到这个错误消息,即使结果打印正确 PHP注意:第5行中未定义的偏移量:0 PHP堆栈跟踪: $somearray=array(0,1,2,3,4,5,6,0,1,2,3,4,0,1,2); $frequency=array(); foreach($somearray as $key => $val) { $frequency[$somearray[$key]

我试图避免使用array\u count\u值(太慢)来计算出现次数,所以我使用foreach循环,但是我一直在下面得到这个错误消息,即使结果打印正确

PHP注意:第5行中未定义的偏移量:0 PHP堆栈跟踪:

$somearray=array(0,1,2,3,4,5,6,0,1,2,3,4,0,1,2);
$frequency=array();
foreach($somearray as $key => $val) {
        $frequency[$somearray[$key]]++; //THIS IS LINE 5
    }

print_r($frequency);
尽管抛出了所有错误消息,但仍能正确打印:

Array
(
    [0] => 3
    [1] => 3
    [2] => 3
    [3] => 2
    [4] => 2
    [5] => 1
    [6] => 1
)
通知“Undefined offset:0”很详细,在中缀增量操作之前未设置某些索引(另外,
$++
),而常规分配不会引起通知

取消通知:


避免注意:


好的做法是避免通知、警告、错误……

好吧,你从一个空数组开始,所以在你设置它之前没有
0
索引。这不是一个错误,只是一个通知。PHP说“嘿,你想增加一些不存在的东西,所以我假设初始值为0”——这恰好是你想要的。先看看数组键是否存在。如果没有,初始化它。我很好奇,为什么这种方法比
数组\计数\值
更快?你是否做了一些测试来验证它是正确的?您正在处理的实际阵列有多大?(如果速度成了一个问题,我假设它比这里的例子要大得多。)我明白了。我认为内置函数会更快,但我们拭目以待。这是一个有趣的问题!这些数字不是来自数据库,是吗?在这种情况下,按+计数分组可能更有效。我还建议,如果您在输入数组中有一个固定的值范围,那么在循环之前用每个值的零计数初始化输出数组,以避免每次迭代中的isset检查。
...
@$frequency[$val]++;
...
$frequency[$val] = (isset($frequency[$val]))? $frequency[$val]+1 : 1;