当回调函数对正在比较的两个值调用函数时,如何提高 usort() 的性能

问题描述 投票:0回答:1

我有一个与这篇文章类似的问题: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 秒才能完成。

如何才能使排序更快?

php arrays performance usort custom-sort
1个回答
0
投票

不要在排序过程的每次迭代中调用

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),

© www.soinside.com 2019 - 2024. All rights reserved.