计算发生次数时请注意错误

时间:2018-11-16 00:34:38

标签: php php-gd e-notices

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

  1. 生成具有随机数(比如说1000个整数)的数组
  2. 输出图像,并以从0到绘制的最大数字的比例显示所有这些数字的排列方式

输出是一张图像(具有给定的宽度),这就是我得到的:

image output example

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

问题:有时此脚本运行良好,但偶尔会出现无数Notice错误:

  

通知:未定义的偏移量: 61

上/.../index.php中的 398      

通知:未定义的偏移量: 125 ,位于/.../index.php中的第 61

行      

通知::/./ index.php中第 61 ...

行中的未定义偏移: 192

该脚本如下,有一些说明:

  • 第61行标记为红色(下方)
  • 函数toScale()返回intval(number / maxNumber * scaleWidth)
  • inb4不必要的$ counts [num] = 0双重声明,这就是我为解决该问题所做的工作,它似乎没有任何改变
  • 在这两个部分之间的其他任何地方都没有使用
  • $ counts
  • 通知错误的数量永远不等于总数,不是全部,就是全部。

code screenshot

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

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

看起来只是代码的简化,但是以某种方式可以解决问题。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

在第一个循环中,您将在整个循环中每次更新$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));