我有以下数据:
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
我想做的是,例如:
检查它是否在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范围内的区域将突出显示另一个颜色。对不起的信息很抱歉
答案 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所以请确保你查看我写的代码片段而不是复制/粘贴它们。
例如,如果你想要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]++;
}