2012-08-10 86 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");