【问题标题】:natsort malfunction with leading character PHP带有前导字符 PHP 的 natsort 故障
【发布时间】:2013-07-13 19:57:26
【问题描述】:

我有几百个 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
)

【问题讨论】:

    标签: php arrays natsort


    【解决方案1】:

    它的表现和宣传的一样,只是不是你想要的。您可以切换到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) );
    });
    

    【讨论】:

    • 谢谢,看起来usort 是这里的路。只是用return str_replace('p', '', $b); 尝试一下,但你的return strnatcmp ( substr($a,1) , substr($b,1) ); 会根据需要输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多