【问题标题】:Notice error while counting number occurrences计数出现次数时注意错误
【发布时间】:2018-11-16 00:34:37
【问题描述】:

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

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

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

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

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

注意:未定义的偏移量:398 in /.../index.php on line 61

注意:未定义的偏移量:125 in /.../index.php on line 61

注意:未定义的偏移量:192 in /.../index.php on line 61 ...

脚本如下,一些解释:

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

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

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

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

【问题讨论】:

  • 将您的代码发布为纯文本,而不是图像。有关代码格式化帮助,请参阅 formatting
  • 你的第二个循环可以替换为$max = max($data); $counts = array_count_values(array_map('toScale', $data));
  • 很抱歉将我的代码放入图像中,我在尝试正确格式化时遇到了一些错误,以前从未发生过。 Barmar 的想法有效并解决了问题!但是,为什么上面的代码不起作用?
  • 你在两个循环之间修改$data吗?
  • toScale() 中的 maxNumber 是如何确定的?如果它使用全局 $max,它会随着你填充 $counts 数组而改变,从而导致不一致的行为。

标签: php php-gd e-notices


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-10-09
    • 2021-04-27
    • 2023-01-25
    • 2021-06-16
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多