算一个数组PHP

时间:2011-06-16 14:51:30

标签: php arrays positioning heatmap

我有以下数据:

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 =时间戳

我想做的是,例如:

检查它是否在50x50px的盒子中,如果这样计数+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范围内的区域将突出显示另一个颜色。对不起的信息很抱歉

5 个答案:

答案 0 :(得分:4)

好的,我想我已经解决了问题的所在(参见上面问题的评论)。

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

然后,您可以非常轻松地将其填充到数组中。

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

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

然后你可以将它打印到一个表格中(行和列标题是单元格数乘以50)。

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

答案 1 :(得分:0)

虽然这个问题措辞不够,但我想我明白你的要求。这是你应该做的。我不是那么流利的PHP所以请确保你查看我写的代码片段而不是复制/粘贴它们。

  1. 查找最大X和Y值。
  2. 基于这些值除以50来实例化和初始化2D数组。
  3. 例如,如果你想要Array[X][Y],你会这样做:

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

    这应该像你需要的那样将2D数组实例化并初始化为全0,

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

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

    同样,我不是php的专业人员,并且刚刚开始使用它,但这应该是一个好的开始。

答案 2 :(得分:0)

框的坐标为:

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

使用坐标可以使它们成为一个n维数组

答案 3 :(得分:0)

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

答案 4 :(得分:0)

首先,你需要用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]++;
}