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 收集的密钥恢复前缀
还有比这种蛮力方法更好的方法吗?
uasort
与自定义比较回调,使用 strnatcmp
。然后,您可以去掉任何 _
前缀,然后再将这两个值传递给 strnatcmp.
uasort($temp_files, function($a, $b) {
return strnatcmp(ltrim($a, '_'), ltrim($b, '_'));
});
编辑:将 usort
替换为 uasort
,以维护密钥。
这里是示例代码:
<?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 收集的密钥恢复前缀
还有比这种蛮力方法更好的方法吗?
uasort
与自定义比较回调,使用 strnatcmp
。然后,您可以去掉任何 _
前缀,然后再将这两个值传递给 strnatcmp.
uasort($temp_files, function($a, $b) {
return strnatcmp(ltrim($a, '_'), ltrim($b, '_'));
});
编辑:将 usort
替换为 uasort
,以维护密钥。