首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >适用于使用范围的表的数据结构

适用于使用范围的表的数据结构
EN

Stack Overflow用户
提问于 2009-12-15 03:27:34
回答 6查看 351关注 0票数 5

我有一个表,看起来像这样:

代码语言:javascript
运行
复制
       <22  23-27   
8-10   1.3   1.8
11-13  2.2   2.8
14-16  3.2   3.8

而且它还在继续。所以我想像这样查找一个值:

代码语言:javascript
运行
复制
lookup(11,25)

并获得响应,在本例中为2.8。最好的数据结构是什么?我有CSV格式的数据。

我希望在PHP中编程。

谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-12-15 03:38:01

我当然不是说这是最好或最有效的数据结构,但这是我将数据映射到与原始数据非常相似的二维PHP数组的方法:

代码语言:javascript
运行
复制
$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函数中添加一些解析逻辑:

代码语言:javascript
运行
复制
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;
}
票数 2
EN

Stack Overflow用户

发布于 2009-12-15 03:36:54

比如一种二维数据结构。

代码语言:javascript
运行
复制
X "coordinates" being <22, 23-27
Y "coordinates" being ...

二维数组可能可以用于此目的。

然后,您将需要一些函数来将特定的X和Y值映射到范围,但这应该不会太难。

票数 1
EN

Stack Overflow用户

发布于 2009-12-15 03:54:30

数据库结构:

代码语言:javascript
运行
复制
values
------
value
x_range_start
x_range_end
y_range_start
y_range_end

代码:

代码语言:javascript
运行
复制
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
    "

    /---/
}

您的数据将像这样映射到数据库:

代码语言:javascript
运行
复制
      <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轴的开始和结束编号。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1902942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档