4

我们试图在数据库中存储诸如高度或长度之类的东西,例如英尺英寸。我无法找出存储干净数据的最佳方法,但管理界面用户也很容易使用。

例子

5' 7"

我预计稍后我需要将其作为搜索结果功能的一部分进行排序,但以这种方式存储,它是一个字符串。

对我来说最合乎逻辑的是将值作为英寸(数字)存储在数据库中,但是对于将使用这个内容管理系统的人来说,计算转换为单个数值的工作量太大了。

还有人担心用户可能会通过以下几种方式输入它:

5' 7"

5'7"

5' 7''

5’ 7”

5‘ 7“

不要问为什么……我们都知道人们会做愚蠢的事情。

我们在WordPress之上使用高级自定义字段,所以我可以构建一个“长度”或“高度”字段类型以在这种情况下使用,它可以处理用户所需的任何计算,但我可能需要一个好的计划在尝试构建附加组件之前攻击解决方案。

绞尽脑汁想弄清楚如何最好地归档这些数据。任何解决方案表示赞赏。

4

5 回答 5

7

以英寸为单位存储。您可以允许用户单独输入(一个输入英尺,另一个输入英寸),这允许验证并消除数据输入问题,允许轻松正确排序(74“总是大于64”),并且可以轻松通过除法和模运算转换为英尺/英寸。(当存储为英寸时,您还可以更轻松地对它们进行数学运算 - 计算 60 和 74" 之间的差异比计算 5'0" 和 6'2" 之间的差异更容易。)

至于用户无法进行转换,不要要求他们这样做。您这样做 - 在存储在数据库中的过程中将英尺/英寸转换为英寸,然后将其转换回显示或允许编辑。

正如我所说,排序也容易得多。对数字进行排序始终使它们保持正确的顺序,而对字符值进行排序可能会导致问题。例如,数字排序总是正确地放在10之后9,而字符排序则放在10之后1

于 2012-11-28T17:55:51.470 回答
5

让我们把它分成2块。第一个是关于用户如何输入数据,第二个是你将如何存储它。

1 - 用户输入
您可以提供单个字段并允许用户在预览时输入日期(使用不同的字符来识别英尺/英寸或英尺和英寸的不同字段,这将只接受数值。

2 - 数据存储
如果您只提供一个字段,我建议您解析和验证输入并将其保存为数值,以便您轻松订购,但每次您都需要将其从数字转换为英尺/英寸'将使用这些值。我的另一个建议是在您的表格中使用 2 个字段,以便您可以将提要存储在一个中,而将英寸存储在另一个中。这将允许您订购结果集,并且在需要使用它们时不会浪费处理器时间来转换值。

于 2012-11-28T18:06:39.567 回答
1

以最合乎逻辑的格式存储 - 厘米。英尺和英寸?!真的!

如果您的用户需要在前端查看英尺和英寸输入,请在存储到数据库之前转换为 cm。

所以使用这样的函数在前端显示

/**
 * Converts a height value given in cm to feet and inches
 *
 * @param int $cm
 * @return array
 */
public function convert_to_inches($cm) {
    $inches = round($cm * 0.393701);
    $result = [
        'ft' => intval($inches / 12),
        'in' => $inches % 12,
    ];

    return $result;
}

然后在存储到数据库之前转换为 cm。

/**
 * Converts a height value given in feet/inches to cm
 *
 * @param int $feet
 * @param int $inches
 * @return int
 */
public function convert_to_cm($feet, $inches) {
    $inches = ($feet * 12) + $inches;
    return (int) round($inches / 0.393701);
}

这样做的好处是您可以创建一个同时提供公制和英制的前端 UI - 因为,您知道,世界上大多数地方都使用公制。

于 2014-02-11T04:54:22.217 回答
0

您应该将该值规范化为数据库的标准格式。我建议使用厘米或毫米,因为它们比英制单位更适合算术,但这取决于你。

您应该构建一个函数,将(某种程度上)任意用户输入转换为这种标准化格式。比如说,一个将5'7''、或转换为厘米的函数。该功能应该接受合理数量的合理格式,无论您喜欢支持多少,并拒绝它无法识别的其他值。5'7"5' 7''5' 7"

然后将此标准化值存储在您的数据库中,并根据需要在输出时将其格式化为英尺/英寸。

于 2012-11-28T17:56:42.733 回答
0

最合乎逻辑的做法是将值以毫米的形式存储在数据库中,一个字段用于宽度,另一个字段用于高度。

然后为 CMS 构建一个插件,它将输入数据(作为字符串)转换为 mms 中的相关浮点值以用于数据库插入......奇怪的是,我最近做了一些类似于一个小的 JavaScript“程序”来放置一个网站上的公制/英制计算器。

基本上,JS 获取用户输入字符串并使用正则表达式将它们分开,以将它们转换为“单位块”,然后将其转换为毫米。

正则表达式看起来像:

//regexps
  var reImperialLengths = /[0-9\,\.\/\s]+\s*(?:yd|yds|yard|yards|\'|ft|foot|feet|\"|in|ins|inch|inches)/i;
  var reImperialLengthsFormat = /^[^0-9]*(?:([0-9]+\.?[0-9]*)\s*(?:yd|yds|yard|yards))?\s*(?:([0-9]+\.?[0-9]*)\s*(?:\'|ft|foot|feet))?\s*(?:([0-9]+)\s*(?:([0-9]+)\/([0-9]+))?\s*(?:\"|in|ins|inch|inches))?\s*$/i;

  var reMetricLengths = /[0-9\,\.\s]+\s*(?:m|cm|mm)/i;
  var reMetricLengthsFormat = /^[^0-9]*(?:([0-9]+\.?[0-9]*)\s*(?:m|metres))?\s*(?:([0-9]+\.?[0-9]*)\s*(?:cm|cms|centimetres?))?\s*(?:([0-9]+)\s*(?:mm|mms|millimetres))?\s*$/i;

这为您在用户输入数据的方式上提供了更大的灵活性,并允许您非常轻松地进行您可能需要的任何计算,因为程序本身将使用数字。

只需将数字转换回您希望在前端显示的方式即可。你也可以在那里美化它,以便它输出1'任何304.8mms东西。

用户仍然可以填充输入字符串,但它使他们“弄错”的方法更少。

于 2012-11-28T18:06:28.510 回答