带有主角PHP的natsort故障

时间:2013-07-13 11:42:15

标签: php arrays natsort

我有几百个xhtml文件,我推送到一个数组的名称。命名约定为p0x.xhtml,其中x为1-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
)

1 个答案:

答案 0 :(得分:0)

它表现得像宣传的那样,而不是你想要的方式。你可以切换到usort/uasort,它允许你提供自己的比较功能,在你的情况下,一个函数返回字符串的自然顺序减去前导p?

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

被称为

usort($arr,'cmp');

正如in another question指出的那样,在php 5.3+中,这可以改写为

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