计算出现次数时注意错误

Notice error while counting number occurrences

我正在创建一个简单的 .php 脚本

  1. 生成一个包含随机数的数组(比如 1000 个整数)
  2. 输出一个图像,其中显示所有这些数字的排列,从 0 到绘制的最大数字

输出的是一张图片(给定宽度),这是我得到的:

如您所见, 在某些时候更高。这是因为图像通常不够宽,无法显示所有数字,所以如果一个像素上有更多数字,则条形会更高。

问题: 有时这个脚本运行良好,但偶尔会出现很多通知错误:

Notice: Undefined offset: 398 in /.../index.php on line 61

Notice: Undefined offset: 125 in /.../index.php on line 61

Notice: Undefined offset: 192 in /.../index.php on line 61 ...

脚本在下面,一些解释:

更新:Barmar所述,我代码中的第二个循环可以替换为

$max = max($data); $counts = array_count_values(array_map('toScale', $data));

看起来只是代码简化,但不知何故这解决了问题。为什么?

问题是您在两个循环中以不同的方式缩放数字。

在第一个循环中,每次循环都更新 $max,然后调用 toScale(data[$x])。由于 toScale() 取决于 $max,一些数字将被缩放到不同的最大值。

在第二个循环中,一切都缩放到最终最大值。因此,对于相同的 $data[$a] 值,您这次会得到不同的 toScale($data[$a])

在调用 toScale 之前,您需要计算所有数字中的最大值。一种方法是计算生成所有随机数的循环中的最大值:

$max = 0;
for ($a = 0; $a < $num; $a++) {
    $rand = rand();
    if ($rand > $max) {
        $max = $rand;
    }
    $data[] = $rand;
}

或者您可以使用内置函数来完成:

$max = max($data);
$counts = array_count_values(array_map('toScale', $data));