php - 计算自然排序值以存储在数据库中以进行字符串排序

标签 php algorithm sorting

下面是一些字符串的例子(主要是地址):

12
20
43-B
43-C
123
2500

现在我将它们按照我认为“正确”的顺序排列。如果我将这些值放在数据库表的列中并在 MySQL 搜索中返回这些值,我会得到:

12
123
20
2500
43-B
43-C

显然这是不正确的 -- 20 不大于 123

如果我能保证该值由纯整数组成,那么很容易弄清楚这一点,但是当您输入 43-B43-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;

演示 http://codepad.viper-7.com/kefb4L

关于php - 计算自然排序值以存储在数据库中以进行字符串排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11213201/

相关文章:

matlab - "Desort"一个矩阵。在 Matlab 中撤消排序

wpf - 如何按完整日期格式化 WPFToolkit.DataGridTextColumn?

php - 从数组构建越来越长的字符串

php - 多行未定义索引错误,用于过滤和分页PHP

java - 这个归并排序有什么问题呢?

c# - 如何在 C# 中创建值生成器 ala hex

ruby - 在二维数组中注入(inject)增量计数器

php - Elastic Search PHP搜索查询出了什么问题?

PHP session 安全

algorithm - 组生成算法?