我正在使用php的自然排序算法natsort
,但我考虑了内存使用情况。
这是怎么回事。脚本从mysql中提取数据并将结果放入数组中,而不是在其上应用natsort
。但这是抓住了。 Row的文本可能很长,可能有数百行。
示例代码:
$array = array();
while ($row = $db->getResults()) {
$array[$row->code] = $row->text;
}
if (empty($array)) {
uksort($array, "strnatcmp");
}
我想知道这会影响记忆力吗?这是合适的方法,还是应该做一些更高效,更愉快的事情?
答案 0 :(得分:1)
您可以做的一件事是存储一个新列,该列复制您要排序的列,但将其存储为转换格式,在使用常规排序算法时会自然排序。
从概念上讲,你可以通过用零填充数字序列到一个长度来做到这一点,该长度将与字符串中可能出现的最长数字序列一样长。
我的解决方案并不完全坚固,但如果你的字符串只有已知最大长度的数字序列,那么你可以用零填充它们到已知的最大长度。例如,如果您有CD曲目标题,并且标题中嵌入了曲目编号,如:
1 Foo
2 Bar
...
10 Baz
也许你决定最长的数字序列可能是3(999个可能的音轨),所以你可以填充数字序列,如
001 Foo
002 Bar
...
010 Baz
这适用于具有多个数字序列的字符串。
示例php代码,虽然您可以编写一个mysql存储函数来执行此操作,然后在表上使用insert和update触发器,以便透明地维护它。
$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
这也允许您在该列上放置一个索引,为您提供良好的排序性能。
答案 1 :(得分:-1)
您需要使用MySQL WHERE
,GROUP BY
和ORDER BY
子句,这样您就不会在PHP级别上浪费时间来解析数千个不需要的记录。