首页 > 解决方案 > 计数出现次数时注意错误

问题描述

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

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

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

图像输出示例

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

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

注意:未定义的偏移量:第61行 /.../index.php 中的398

注意:未定义的偏移量:第61行 /.../index.php 中的125

注意:未定义的偏移量:第61行 /.../index.php 中的192 ...

脚本如下,一些解释:

代码截图

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

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

它看起来只是代码简化,但这以某种方式解决了问题。为什么?

标签: phpphp-gde-notices

解决方案


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

在第一个循环中,您$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));

推荐阅读