0

我正在使用 php 的自然排序算法natsort,但我考虑了内存使用情况。

事情就是这样。脚本从 mysql 中提取数据并将结果放入数组中,然后natsort对其进行应用。但这就是问题所在。行的文本可能很长,可能有数百行。

示例代码:

$array = array();
while ($row = $db->getResults()) {
  $array[$row->code] = $row->text;
}

if (empty($array)) {
  uksort($array, "strnatcmp");
}

我想知道这对记忆有何影响?这是适当的方法还是我应该做一些更有效、更愉快的事情?

4

2 回答 2

1

您可以做的一件事是存储一个新列,该列复制您要排序的列,但以转换格式存储,当使用常规排序算法时,该格式将自然排序。

从概念上讲,您可以通过将零填充数字序列的长度与字符串中可能出现的最长数字序列一样长来做到这一点。

我的解决方案并不完全坚固,但如果你的字符串只有已知最大长度的数字序列,那么你可以用零填充它们到已知的最大长度。例如,如果您的 cd 曲目标题中嵌入了曲目编号,例如:

1 Foo
2 Bar
...
10 Baz

也许您决定可能的最长数字序列是 3(999 个可能的轨道),因此您可以填充数字序列,例如

001 Foo
002 Bar
...
010 Baz

这适用于具有多个数字序列的字符串。

示例 php 代码,尽管您可以编写一个 mysql 存储函数来执行此操作,然后在表上使用插入和更新触发器,以便透明地维护它。

$input = 'a44b1c399d4';
$nat = preg_replace_callback('#\d+#', function($m) {
    return str_pad($m[0], 3, '0', STR_PAD_LEFT);
}, $input);
echo $nat; // a044b001c399d004

然后只需通过 mysql 排序

order by natsort_column

这还允许您在该列上放置索引,从而为您提供良好的排序性能。

于 2013-01-26T18:36:57.107 回答
-1

您需要使用 MySQL WHEREGROUP BYORDER BY子句,这样您就不会在 PHP 级别浪费时间来解析数千条不需要的记录。

于 2013-01-26T17:10:59.647 回答