【问题标题】:Count an array php计算一个数组php
【发布时间】:2011-09-16 11:06:36
【问题描述】:

我有以下数据:

a  , b , c   , d                 , e  , f
375, 52, 1892, http://example.com, ::1, 1308233412
341, 52, 1892, http://example.com, ::1, 1308233412
422, 52, 1892, http://example.com, ::1, 1308233417
478, 50, 1892, http://example.com, ::1, 1308233418
58, 481, 1892, http://example.com, ::1, 1308233432
69, 481, 1892, http://example.com, ::1, 1308233432
487, 49, 1892, http://example.com, ::1, 1308233432
  • a = 位置 y
  • b = 位置 x
  • c = 屏幕分辨率(浏览器)
  • d = 主机
  • e = ip
  • f = 时间戳

我想做的是,例如:

检查它是否在 50x50 像素的框中,如果是,则计数 +1。

所以我会有一张这样的桌子:

y/x |  0 | 50  | 100  | 150
----+----+-----+------+----
50  | 0  |  1  |   2  |   0
100 | 0  |  0  |   1  |   0
150 | 1  |  0  |   0  |   1
200 | 2  |  2  |   3  |   0
etc.

希望有人可以帮助我实现上述目标

他下面的链接正在创建一个热图,http://www.design-code.nl/example/heatmap.php,但是热图是重叠的,所以我想把绿点放在一个被计数的数组中,而那些在 50x50 以内的区域将用另一种颜色突出显示。抱歉信息不全

【问题讨论】:

  • 呃...检查一下 50x50 的盒子里有没有什么?
  • 这个问题真的是关于Count an array php吗?
  • 你能再解释一下矩阵吗?这些值是什么意思 - 可以容纳 (x,y) 指定的尺寸的 50x50 框的数量?
  • @spudley,例如 (375) = 框内 (350-400) 和 (52) = 框内 (50-100)。 @starx 数据在一个数组中,所以我想我需要在数组中计算它们
  • @rayrule:好的,我认为我明白了。您想将屏幕划分为 50x50 的框,将其表示为 PHP 数组,然后查看位置 x 和 y 字段以确定这些坐标位于哪个框。这是对您的合理描述吗?后?这个问题很难阅读,所以我希望我现在已经理解了。

标签: php arrays positioning heatmap


【解决方案1】:

首先,您需要用 0 填充一个完整的数组:

$result = array();
for($i=0;$i<2000;$i+=50){
    $result[$i] = array();
    for($j=0;$j<2000;$j+=50){
        $result[$i][$j] = 0;
    }
}

其中 2000 是最大屏幕宽度/高度。然后,你计算你的值,$a 是你的数组:

foreach($a as $v){
    $result[floor($v[0]/50)*50][floor($v[1]/50)*50]++;
}

【讨论】:

    【解决方案2】:

    好的,我想我已经弄清楚了问题的含义(请参阅我对上述问题的评论)。

    我这样做的方法是将 X 和 Y 位置除以 50,然后使用 floor() 函数从中获取整数值。这将是他们所在的盒子编号。

    然后您可以很容易地将其填充到数组中。

    以下代码将生成您需要的数组:

    $map = array();
    foreach($data as $row) {
        $map[floor($row['x']/50)][floor($row['y']/50)]++;
    }
    

    然后您可以将其打印到表格中(行和列标题为单元格编号乘以 50)。

    您可能希望事先将$map 数组填充为零,以便在没有任何命中的单元格中获得零,或者您可以在打印时解决此问题;由你决定)

    【讨论】:

      【解决方案3】:

      您想寻找空间填充曲线。 sfc 通常用于热图并将 2d 复杂度降低到 1d 复杂度。您想查找 Nick 的希尔伯特曲线空间四叉树博客。

      【讨论】:

        【解决方案4】:

        虽然这个问题措辞不佳,但我想我理解您的要求。这是你应该做的。我对 php 不是很流利,所以请确保您查看我编写的代码 sn-ps,而不是复制/粘贴它们。

        1. 找到最大的 X 和 Y 值。
        2. 根据这些值除以 50 来实例化和初始化二维数组。

        例如,如果你想要Array[X][Y],你会这样做:

        $myArray = array();
        for ($x = 0; $x < $maxX / 50; $x++) {
            $myArray[] = array();
            for ($y = 0; $y < $maxY / 50; $y++) {
                $myArray[$x][] = 0;
            }
        }
        

        这应该像你需要的那样实例化一个二维数组并将其初始化为全 0

        3) 遍历您的数组并为每个条目将 $myArray[$curX/50][$curY/50] 的值增加 1:

        foreach ($inputArray as $curRow) $myArray[$curRow[b]/50][$curRow[a]/50] += 1;
        

        再说一次,我不是 php 专家,我才刚刚开始使用它,但这应该是一个好的开始。

        【讨论】:

        • 以下链接正在创建一个热图 design-code.nl/example/heatmap.php ,但热图是重叠的,所以我想将绿点放在一个计数的数组中,这些区域将用其他颜色突出显示。抱歉,信息不佳
        • 如果你想要做的是创建一个热图,你应该首先创建一个高度图。你首先问的是创建一个高度图,但它会是一个锯齿状的高度图。尽管如此,我上面所说的应该照顾你要求完成的事情。
        【解决方案5】:

        盒子的坐标是:

        $x_coor = floor ($a / 50);
        $y_coor = floor ($b / 50);
        

        通过坐标,您可以将它们填满一个 n 维数组

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-21
          • 1970-01-01
          • 2023-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多