PHP natsort 忽略可选前缀

PHP natsort ignoring optional prefix

这里是示例代码:

<?php
$temp_files = array("_temp15.txt","temp10.txt", "temp1.txt","temp22.txt","_temp2.txt");

natsort($temp_files);
print_r($temp_files);
?>

实际输出:

[4] => _temp2.txt 
[0] => _temp15.txt 
[2] => temp1.txt 
[1] => temp10.txt 
[3] => temp22.txt

期望的输出:

[2] => temp1.txt 
[4] => _temp2.txt 
[1] => temp10.txt 
[0] => _temp15.txt 
[3] => temp22.txt

换句话说,我想执行忽略给定(但可选)前缀的自然排序。在这种情况下,可选前缀是 _.

在我的用例场景中,文件名是唯一的,无论前缀是否存在。 IE。不允许 temp1.txt_temp1.txt

我找到的丑陋的解决方案是:

  1. 在所有项目中循环并存储带有前缀
  2. 的键
  3. 从数组中删除前缀
  4. 对数组进行排序
  5. 使用在点 1 收集的密钥恢复前缀

还有比这种蛮力方法更好的方法吗?

uasort 与自定义比较回调,使用 strnatcmp。然后,您可以去掉任何 _ 前缀,然后再将这两个值传递给 strnatcmp.

uasort($temp_files, function($a, $b) {
   return strnatcmp(ltrim($a, '_'), ltrim($b, '_')); 
});

编辑:将 usort 替换为 uasort,以维护密钥。