我有一个表,看起来像这样:
<22 23-27
8-10 1.3 1.8
11-13 2.2 2.8
14-16 3.2 3.8
而且它还在继续。所以我想像这样查找一个值:
lookup(11,25)
并获得响应,在本例中为2.8。最好的数据结构是什么?我有CSV格式的数据。
我希望在PHP中编程。
谢谢。
发布于 2009-12-15 03:38:01
我当然不是说这是最好或最有效的数据结构,但这是我将数据映射到与原始数据非常相似的二维PHP数组的方法:
$fp = fopen('data.csv', 'r');
$cols = fgetcsv($fp);
array_shift($cols); // remove empty first item
$data = array();
while ($row = fgetcsv($fp)) {
list($min, $max) = explode('-', $row[0]);
// TODO: Handle non-range values here (e.g. column header "<22")
$data["$min-$max"] = array();
for ($x = 0; $x < count($cols); $x++) {
$data["$min-$max"][$cols[$x]] = $row[$x + 1];
}
}
然后,您需要在lookup
函数中添加一些解析逻辑:
function lookup($row, $col) {
$return = null;
// Loop through all rows
foreach ($data as $row_name => $cols) {
list($min, $max) = explode('-', $row_name);
if ($min <= $row && $max >= $row) {
// If row matches, loop through columns
foreach ($cols as $col_name => $value) {
// TODO: Add support for "<22"
list($min, $max) = explode('-', $col_name);
if ($min <= $col && $max >= $col) {
$return = $value;
break;
}
}
break;
}
}
return $return;
}
发布于 2009-12-15 03:36:54
比如一种二维数据结构。
X "coordinates" being <22, 23-27
Y "coordinates" being ...
二维数组可能可以用于此目的。
然后,您将需要一些函数来将特定的X和Y值映射到范围,但这应该不会太难。
发布于 2009-12-15 03:54:30
数据库结构:
values
------
value
x_range_start
x_range_end
y_range_start
y_range_end
代码:
function lookup(x, y) {
sql = "
SELECT * FROM values
WHERE
x >= x_range_start
AND
x <= x_range_end
AND
y >= y_range_start
AND
y <= y_range_end
"
/---/
}
您的数据将像这样映射到数据库:
<22 23-27
8-10 1.3 1.8
11-13 2.2 2.8
14-16 3.2 3.8
(value, x start, x end, y start, y end)
1.3, 0, 22, 8, 10
1.8, 23, 27, 8, 10
2.2, 0, 22, 11, 13
...
基本上是存储表中每个值的x和y轴的开始和结束编号。
https://stackoverflow.com/questions/1902942
复制相似问题