2013-10-02 58 views
1

我有一個值的數組,我想按字母順序排序,與字符排序後的數字。PHP:排序字符後排列的數字

例如,給出下面的字符串:

Core 2 Duo, Core Duo, Core Quad, Core 4 Quad 

我想它最終下令像這樣:

Core Duo, Core 2 Duo, Core Quad, Core 4 Quad 

相反,PHP的sort()函數對這樣的:

Core 2 Duo, Core 4 Quad, Core Duo, Core Quad 

自然排序返回與常規排序相同的結果。

那麼有沒有什麼辦法可以告訴PHP:「如果遇到一個數字,就像它在Z之後進行排序」一樣?

+3

你應該嘗試[usort(http://php.net/manual/en/function.usort。 php) – Rob

+1

順便說一句,沒有'Core 4 Quad',但有'Core 2 Quad' – zerkms

+1

這實際上沒有道理,誠實。如果字母的排序值比數字更高,爲什麼'Core Quad'會在'Core 2 Duo'和'Core 4 Quad'之間運行?你可以提供一個更大的集合,你想如何分類,以便可以確定更通用的算法? – Anthony

回答

3

看來你所追求的是一種將你的字符串的所有數字元素推到後面的函數,例如, 「Core 2 Duo」=>「Core Duo 2」。

// moves numeric parts of the string to the back 
function transform($s) 
{ 
     $parts = explode(' ', $s); 
     foreach (array_filter($parts, 'is_numeric') as $key => $value) { 
       unset($parts[$key]); 
       $parts[] = $value; 
     } 
     return join(' ', $parts); 
} 

// natural sort on transformed strings 
function cmp($a, $b) 
{ 
    return strnatcmp(transform($a), transform($b)); 
} 

$a = array('Core 2 Duo', 'Core Duo', 'Core Quad', 'Core 2 Quad'); 

usort($a, 'cmp'); 

print_r($a); 
+0

推動他們到後面,這真的很聰明。 – Anthony

1

這裏是您的解決方案:

<?php 

$array = array('Core 2 Duo', 'Core Duo', 'Core Quad', 'Core 4 Quad'); 

$tempArray = array(); 
foreach($array as $key=>$value) { 
    $exp = explode(" ",$value); 
    if(count($exp)==3) { 
     $tempArray[$key] = $exp[0]." ".$exp[2]." ".$exp[1]; 
    } else { 
     $tempArray[$key] = $exp[0]." ".$exp[1]." "."-1"; 
    } 
} 

asort($tempArray); 

$sortedArray = array(); 
foreach($tempArray as $key=>$value) { 
    $sortedArray[] = $array[$key]; 
} 

print_r($sortedArray); 

?> 

輸出:

Array 
(
    [0] => Core Duo 
    [1] => Core 2 Duo 
    [2] => Core Quad 
    [3] => Core 4 Quad 
)