我们试图在数据库中存储类似高度或长度的内容,例如英尺英寸。我无法找到存储干净数据的最佳方法,但管理界面用户也很容易使用。
5' 7"
我预计我需要稍后将其作为搜索结果函数的一部分进行排序,但是以这种方式存储,它是一个字符串。
对我来说最合乎逻辑的是将数值存储为数据库中的英寸(数字),但计算转换为单个数值对于将使用此内容管理系统的人来说太过分了。< / p>
还有一种担忧是用户可以通过以下几种方式输入:
5' 7"
5'7"
5' 7''
5’ 7”
5‘ 7“
不要问为什么......我们都知道人们做蠢事。
我们在Advanced Custom Fields之上使用WordPress,因此我可以构建一个“长度”或“高度”字段类型,以便在这种情况下使用,它可以处理用户所需的任何计算,但在尝试构建附加组件之前,我可能需要一个很好的攻击计划。
绞尽脑汁试图找出如何最好地存档这些数据。任何解决方案都表示赞赏。
答案 0 :(得分:6)
以英寸为单位存储。您可以允许用户单独输入(一个用于脚,一个用于英寸),允许验证并删除数据输入问题,允许轻松正确排序(74“总是超过64”),并且可以轻松通过除法和模运算转换为英尺/英寸。 (当你以英寸为单位存储时,你也可以更容易地对它们进行数学运算 - 更容易找出60到74之间的差异,而不是5'0“和6'2”之间的差异。)
就用户无法进行转换而言,不要求他们这样做。你这样做 - 在存储在数据库中的路上将英尺/英寸转换为英寸,并将其转换回显示或允许编辑。
正如我所说,排序也更容易。排序数字总是使它们保持正确的顺序,而排序字符值可能会导致问题。例如,数字排序总是在10
之后正确放置9
,而字符排序会在10
之后放置1
。
答案 1 :(得分:5)
让我们分成两块。第一个是用户将如何输入数据,第二个是如何存储数据。
1 - 用户输入
您可以提供单个字段,并允许用户在预览时输入日期(使用不同的字符来标识英尺/英寸或英尺和英寸的不同字段,只接受数字值。
2 - 数据存储
如果您只提供一个字段,我建议您解析并验证输入并将其保存为数值,这样您就可以轻松订购它,但每当您需要将它从数字转换为英尺/英寸时#39 ;重新使用这些值。
我的另一个建议是在你的表中使用2个字段,这样你就可以将feed存储在另一个中,而将in存储在另一个中。这将允许您订购结果集,并且在您需要使用它们时,您不会浪费处理器时间来转换值。
答案 2 :(得分: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);
}
这样做的好处是,您可以创建一个既提供指标又提供英制的前端用户界面 - 因为,您知道,世界上大多数都使用指标。
答案 3 :(得分:0)
您应该将值规范化为数据库的标准格式。我建议厘米或毫米,因为它们比帝国单位更适合算术,但这取决于你。
您应该构建一个功能,将(某种程度上)任意用户输入转换为此标准化格式。比方说,这是一个将5'7''
,5'7"
,5' 7''
或5' 7"
变为厘米的函数。该函数应接受合理数量的合理格式,无论您感觉支持多少,并拒绝其无法识别的其他值。
然后将此标准化值存储在数据库中,并根据需要将其格式化为英尺/英寸。
答案 4 :(得分:0)
最合乎逻辑的做法是使用将值存储在数据库中的毫米数,其中一个字段用于宽度,另一个用于高度。
然后为CMS构建一个插件,它将输入数据(作为字符串)转换为mms中用于数据库插入的相关浮点值...奇怪的是我最近做了类似于小型JavaScript“程序”的类似操作将公制/英制计算器放在网站上。
基本上,JS使用用户输入字符串并使用正则表达式将它们分开,将它们转换为“单位块”,然后转换为毫米。
RegExps看起来像:
//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
。
用户仍然可以填充输入字符串,但这样可以减少“弄错”的方法。