2012-08-10 127 views
3

那麼, 有很多帖子和問題使用usort排序數組自定義模式,但沒有找到任何符合我的需要。 這裏是我到目前爲止的代碼,使用usort對給定序列上的數組進行排序?

$arrayToSort=array("Sabin","Anil","Cyrus","Kamal","Kesha","Bimal"); 

function mycmp($a, $b) 
{ 
    static $order = array('A', 'B','C',"Ke'",'Ka','R', 'S'); 
    return array_search(substr($a,0,1), $order) - array_search(substr($b,0,1), $order); 
} 

usort($arrayToSort, "mycmp"); 

以上代碼在下列方式排序$ arrayToSort

Array 
(
    [0] => Anil 
    [1] => Bimal 
    [2] => Cyrus 
    [3] => Kamal 
    [4] => Kesha 
    [5] => Sabin 
) 

但是,如果你仔細看我的自定義模式static $order = array('A', 'B','C',"Ke'",'Ka','R', 'S');克莎應該卡邁勒來之前在我的模式'柯'之前'嘉'

我再次知道substr($a,0,1)只有第一個字符,這就是爲什麼它不工作。 我也懷疑我不得不採取另一種方法來完成工作,但我無法弄清楚。

如何排序數組模式的元素是否不一致,即某些元素有一個字符而其他元素有兩個?任何幫助將高度讚賞。由於

回答

1

這裏有一種方法可以做到這一點。這當然可以更好地優化,但你明白了。

<?php 

class Accessor { 
    static $order = array(
    'A' => 1, 
    'B' => 1, 
    'C' => 1, 
    'K' => array(
     'e' => 1, 
     'a' => 1, 
    ), 
    'R' => 1, 
    'S' => 1 
); 
} 

$arrayToSort=array("Kamal","Kesha","Sabin","Anil","Cyrus","Bimal"); 

function mycmp($a, $b, $base) { 
    $letter1 = $a[0]; 
    $letter2 = $b[0]; 
    if ($letter1 == $letter2) { 
    if (is_array($base[$letter1])) { 
     return mycmp(substr($a, 1), substr($b, 1), $base[$letter1]); 
    } 
    } 
    return array_search($letter1, array_keys($base)) - array_search($letter2, array_keys($base)); 
} 

function cmp_proxy($a, $b) { 
    return mycmp($a, $b, Accessor::$order); 
} 

usort($arrayToSort, "cmp_proxy"); 
print_r($arrayToSort); 

輸出

Array 
(
    [0] => Anil 
    [1] => Bimal 
    [2] => Cyrus 
    [3] => Kesha 
    [4] => Kamal 
    [5] => Sabin 
) 
+0

謝謝,這個工程完全按照我想要的。但我想知道的一件事是爲什麼使用類?,如果我們在函數cmp_proxy()中使用static $ order,而不是在類中定義它,它會產生什麼樣的區別? – WatsMyName 2012-08-10 14:27:37

0

試試這個

$arrayToSort=array("Sabin","Anil","Cyrus","Kamal","Kesha","Bimal"); 

    function mycmp($a, $b) 
    { 
     static $order = array('A', 'B','C',"Ke'",'Ka','R', 'S'); 
     return searchArray($a, $order) - searchArray($b, $order); 
    } 
    function searchArray($str,$order) { 

    $i = 1; 
    do { 

    $result = array_search(substr($str,0,$i++),$order); 
    if($result) 
    return $result 
    }while(i < strlen($str)) 
    return -1; 
    } 
    usort($arrayToSort, "mycmp");