2017-05-09 32 views
1

我正在使用以下代碼使用本機排序算法對值進行排序。如何對Imperial數組進行排序(帶分數的英寸)?

usort($this->_items, function($a, $b) { return strnatcasecmp($a['label'], $b['label']);}); 

但問題是它沒有爲以下正確排序值:

$array=array('18"', '4"', '18 1/2"', '18 1/4"'); 

應該按照以下順序

4" 
18" 
18 1/4" 
18 1/2" 

值進行排序有什麼辦法,我可以得到這種類型的PHP代碼排序?謝謝。

回答

0

這裏是一個緊小溶液(Demo):

$array=array('18 1/2"','18"','4"','18 11/12"','18 1/4"'); 
foreach($array as $k=>$v){ 
    $copy[$k]=preg_match("/(\d+)\/(\d+)/",$v,$m)?$m[1]/$m[2]+(int)$v:(int)$v; 
} 
array_multisort($copy,SORT_NUMERIC,$array); 
var_export($array); 

輸出:

array (
    0 => '4"', 
    1 => '18"', 
    2 => '18 1/4"', 
    3 => '18 1/2"', 
    4 => '18 11/12"', 
) 

foreach()迭代$array和每個值調用preg_match()以生成$copy數組值。如果它包含尾隨分數,則分數轉換爲十進制格式並添加到整數中,否則字符串值將轉換爲整數。

然後$copy用於array_multisort()來排序$array。完成!

+0

@ p4pravin如果這樣不能正確分類所有可能的尺寸,請更新您的問題以提供一個示例輸入,我的方法將失敗,我將修復我的代碼。 – mickmackusa

0

今天我有一個非常類似的問題,唯一的區別是數字格式略有不同。

5/8

1-3/4

2-13/54

54/64

和幾百更在這種風格我正則表達式的解決辦法是

preg_match_all("/(^.*?)-?(\d+)\/(\d+)/",$input,$matches) 

對此提供的答案的主要優點是第一個捕獲組將會總是匹配整個數字,並且在您必須提供0 5/8或0-5/8的前一個正則表達式的情況下,您可以簡單地讓正則表達式將第一個捕獲組留空。之後它就像

$decimalConversion = $matches[2]/$matches[3]+$matches[1] 

如果您對$ matches [0]感興趣,它將返回所有匹配項。整個數字也不會被這個正則表達式匹配,但是因爲只要它們保留在數組中,你就不需要對它們進行任何轉換,所以你仍然應該能夠正確地進行排序。

而且我在array_msort拉從http://php.net/manual/en/function.array-multisort.php爲更易於閱讀和使用替代品在array_multisort後,我用array_values($陣列)復位鍵新的排序

,並通過按鍵回Magento的作爲直接寫入eav_attribute_option表的值的option_id的sort_order。