php - 计数出现次数时注意错误
问题描述
我正在创建一个简单的 .php 脚本
- 生成一个带有随机数的数组(比如说 1000 个整数)
- 输出图像,其中显示所有这些数字的排列,范围从 0 到绘制的最大数字
输出是一个图像(具有给定的宽度),这就是我得到的:
如您所见,在某些时候,条形更高。这是因为图像通常不够宽,无法呈现所有数字,所以如果一个像素上有更多数字,则条形图会更高。
问题:有时这个脚本运行良好,但偶尔我会收到很多通知错误:
注意:未定义的偏移量:第61行 /.../index.php 中的398
注意:未定义的偏移量:第61行 /.../index.php 中的125
注意:未定义的偏移量:第61行 /.../index.php 中的192 ...
脚本如下,一些解释:
- 第 61 行标记为红色(下)
- 函数 toScale() 返回 intval( number / maxNumber * scaleWidth )
- inb4 $counts[num]=0 不必要的双重声明,这就是我试图解决问题所做的,它似乎没有改变任何东西
- $counts不在这两个部分之间的任何其他地方使用
- 通知错误的数量永远不会等于总数,它要么是少数,要么都不是。
更新:正如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));
推荐阅读
- c# - EF Core Left Outer Join 失败,可空对象必须有一个值
- php - php mysql ssl 连接失败,访问被拒绝错误
- java - 如何从资源服务器中的 Spring Security OAuht2 Boot 中提取声明?
- xamarin.forms - Xamarin 方向信息.plist
- r - 从一个网页中抓取所有表格?
- python - *** 类型错误:get_value_by_attribute() 缺少 1 个必需的位置参数:“属性”
- android - 如何判断是否已正确添加外部依赖项(.aar)?
- swift - 如何从firebase标题文件夹Xcode中归档tableview
- google-cloud-platform - 在 Google Cloud 上并行运行多个 Colab 笔记本?
- java - 使用不同字体大小的 Java 打印发票