2013-07-13 80 views
0

我有幾百個xhtml文件,我推送到一個數組的名稱。命名約定是p0x.xhtml,其中x是1-400。我試圖natsort陣列,但領先的p似乎與排序衝突。natsort與主角字符故障PHP

作爲最後的手段,我可​​以重命名文件,但要儘量避免這種情況。如果有人知道解決方法,我會很感激。

$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 
) 

回答

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)); 
}); 
+0

感謝,看起來像'usort'是要走的路這裏。只是試着用'return str_replace('p','',$ b);'但是你的'返回strnatcmp(substr($ a,1),substr($ b,1));'根據需要輸出 – mzmm56