下面是一些字符串的例子(主要是地址):
12
20
43-B
43-C
123
2500
现在我将它们按照我认为“正确”的顺序排列。如果我将这些值放在数据库表的列中并在 MySQL 搜索中返回这些值,我会得到:
12
123
20
2500
43-B
43-C
显然这是不正确的 -- 20
不大于 123
。
如果我能保证该值由纯整数组成,那么很容易弄清楚这一点,但是当您输入 43-B
和 43-C
(或甚至 12A
或其他),那么我们就会开始遇到问题。但是,我不能简单地删除数字!我现在不完全确定它代表什么,但我确实有 40W1
之类的值。
就个人而言,我会将其排序在 40 以下而不是 4000 以下,但这是一种非常罕见的边缘情况,所以我不太担心这个特定示例。不过,我确实需要记住这些字母,因为 40B
会在 40C
之前出现——但我也希望 40 -B
出现在 40C
之前。棘手,对吧?我知道。
不过,我愿意假设只有字母数字字符(即从字符串中去除 -
)。
我想做的是将该字符串转换为一系列绝对可排序的数字。
例如,43-B
可能会变成类似 10000031205
的内容(填充),并与该行的其余部分一起存储在数据库中。当我搜索我的地址时,我现在可以按排序列进行排序,而且一切都井井有条!
我不能做的事情:
- 在运行时直接比较它们
- 在MySQL中做这个搜索(值需要逐行计算)
- 使用 sort/asort/ksort 或 PHP 中的任何排序函数
我需要一个可以存储在我的数据库或搜索索引中的值,我以后可以根据它进行排序!
不幸的是,到目前为止我的所有尝试都未能产生我正在寻找的结果。有什么想法吗?
最佳答案
我不认为它是最有效的格式,但它会起作用。我假设没有负数。
我填充到 5 位数,但填充需要大于数字序列中的最大位数。
$input = '43-B1';
$nat = preg_replace_callback('#\d+#', function($m) {
return str_pad($m[0], 5, '0', STR_PAD_LEFT);
}, $input);
echo $nat;
关于php - 计算自然排序值以存储在数据库中以进行字符串排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11213201/