我有一个与这篇文章类似的问题:PHP 按文件名中的数字对数组进行排序
我使用了这个
usort()
解决方案:
usort($photos, function ($a, $b) {
return strstr($a, '_') <=> strstr($b, '_');
});
数组是这样的:
array (
0 => 'photo-Cname_0111.jpg',
1 => 'photo-Aname_0112.jpg',
2 => 'photo-Bname_0222.jpg',
3 => 'photo-Cname_0222.jpg',
4 => 'photo-Aname_0333.jpg',
5 => 'photo-Bname_0333.jpg',
)
问题是当数组有 1000 个元素时,需要大约 9 秒才能完成。
如何才能使排序更快?
不要在排序过程的每次迭代中调用
strstr()
两次(时间复杂度为 O(n*log(n))
),而是通过仅使用 strstr()
调用 n
次 array_map()
来创建要排序的临时子字符串数组。 。 演示
array_multisort(
array_map(fn($v) => strstr($v, '_'), $photos),
$photos
);
var_export($photos);
其他需要考虑的回调函数包括:
substr($v, -8)
ltrim($v, '-A..Za..z')
或将整个
array_map()
行替换为 preg_replace('#^\D+#', '', $photos),