2013-08-12 140 views
1

我很慚愧地問這個問題,所以我會盡快解決。如何使用另一個陣列對數組進行排序

我有一個數組,看起來像:

array (size=11) 
    0 => string 'create' (length=6) 
    1 => string 'index' (length=5) 
    2 => string 'restore' (length=7) 
    3 => string 'renew' (length=5) 
    4 => string 'check' (length=5) 
    5 => string 'transfer' (length=8) 
    6 => string 'delete' (length=6) 
    7 => string 'update' (length=6) 

而且我想它進行排序,以使它看起來像:

array (size=...) 
    1 => string 'index' (length=5) 
    2 => string 'update' (length=6) 
    3 => string 'renew' (length=5) 
    and all other values no matter which order 

我沒有規則進行排序,我只有輸出模型數組。

我試過,但我不知道該怎麼瓶蓋內寫:

$modelMenu = array('index', 'update', 'renew'); 

$myCustomFilter = function($a, $b) use ($modelMenu) { 
    var_dump($a, $b); 
}; 

usort($list, $myCustomFilter); 

感謝。

+0

使用http://php.net/manual/en/function.array-multisort.php爲目的 –

+0

你想進行排序,以便第一陣列,它看起來像第二個? –

+0

@FayeqAliKhan exaclty – ShameOnMe

回答

3

它並不需要是一個排序:

$list = array(
    0 => 'create' 
    ,1 => 'index' 
    ,2 => 'restore' 
    ,3 => 'renew' 
    ,4 => 'check' 
    ,5 => 'transfer' 
    ,6 => 'delete' 
    ,7 => 'update' 
); 
$modelMenu = array('index', 'update', 'renew'); 
$list = array_diff($list,$modelMenu); //Filter out elements in $modelMenu from $list 
$list = array_merge($modelMenu,$list); //Put the $modelMenu elements back in at the beginning 
echo '<pre>'.print_r($list,true).'</pre>'; 

輸出:

Array 
(
    [0] => index 
    [1] => update 
    [2] => renew 
    [3] => create 
    [4] => restore 
    [5] => check 
    [6] => transfer 
    [7] => delete 
) 
+0

+1不錯,簡單。 – Jim

+0

謝謝,確實很簡單。完美;-) – ShameOnMe

0

以下應該做你所需要的。它按$modelMenu中的位置排序。

$myCustomFilter = function($a, $b) use ($modelMenu) { 
    $aSortOrder = array_search($a, $modelMenu); 
    $bSortOrder = array_search($b, $modelMenu); 
    if($aSortOrder === false){ 
     $aSortOrder = count($modelMenu); 
    } 
    if($bSortOrder === false){ 
     $bSortOrder = count($modelMenu); 
    } 
    return $aSortOrder-$bsortOrder; 
}; 
相關問題