0

我有几百个 xhtml 文件,我将它们的名称推送到一个数组中。命名约定p0x.xhtmlx1-400。我正在尝试natsort数组,但前导p似乎与排序冲突。

作为最后的手段,我可​​以重命名文件,但如果可能的话想避免这种情况。如果有人知道解决方法,我将不胜感激。

$arr = [
    'p010.xhtml',
    'p08.xhtml',
    'p04.xhtml'
];

print_r($arr);
natsort($arr);
print_r($arr);

产量:

Array
(
    [0] => p010.xhtml
    [1] => p08.xhtml
    [2] => p04.xhtml
)
Array
(
    [0] => p010.xhtml
    [2] => p04.xhtml
    [1] => p08.xhtml
)

期望的输出是:

Array
(
    [0] => p010.xhtml
    [1] => p08.xhtml
    [2] => p04.xhtml
)
Array
(
    [2] => p04.xhtml
    [1] => p08.xhtml
    [0] => p010.xhtml
)
4

1 回答 1

0

好吧,它的表现与宣传的一样,只是不是您想要的方式。您可以切换到usort/uasort,它允许您提供自己的比较函数,在您的情况下,该函数返回字符串的自然顺序减去前导 p?

function cmp($a, $b) {
   return strnatcmp ( substr($a,1) , substr($b,1) );
}

这被称为

usort($arr,'cmp');

正如在另一个问题中指出的那样,在 php 5.3+ 中,这可以重写为

usort($arr,function($a, $b) {
   return strnatcmp ( substr($a,1) , substr($b,1) );
});
于 2013-07-13T11:48:50.803 回答