2010-09-28 110 views
1

我有一個PHP腳本,我使用usort()函數重新排列了一個多維數組。關於PHP usort函數的問題

這是一個樣本陣列陣列$ ARR的(print_r的輸出)

Array 
(
    [3] => Array 
     (
      [name] => Bjudningen 
      [grade] => 5 
      [grade_type] => calculated 
      [orgname] => LInvitation 
      [id] => 13975 
     ) 

    [0] => Array 
     (
      [name] => Coeur fidèle 
      [grade] => 3 
      [grade_type] => calculated 
      [orgname] => Coeur fidèle 
      [id] => 8075 
     ) 

    [2] => Array 
     (
      [name] => Dawsonpatrullen 
      [grade] => 5 
      [grade_type] => calculated 
      [orgname] => The Dawson Patrol 
      [id] => 13083 
     ) 

) 

這是我的PHP腳本

function sort_movies($arr,$val){ 
    function cmp($x, $y) 
    { 
    if ($x[$val] == $y[$val]) 
     return 0; 
    else if ($x[$val] < $y[$val]) 
     return -1; 
    else 
     return 1; 
    } 
    usort($arr, 'cmp'); 
    return $arr; 
} 

$sorted = sort_movies($arr,"grade"); 

我希望能夠在不同的子項的數組進行排序(即姓名,年級,身份證),但它不起作用的方式,我在上面。但是,如果我將$val在排序電影功能中更改爲值"grade"它確實有效,所以出於某種原因,它不會允許我發送排序參數作爲可變值。

它是什麼我做錯了?

回答

0

可以通過發送子鍵索引,即等級而不是子鍵名來嘗試這個。

0

5.3,你可以做這樣的:

function create_sort($key) 
{ 
    return function($x,$y) use($key) 
    { 
     return $x[$key] - $y[$key]; 
    }; 
} 
$sorter = create_sort('name'); 
usort($arr, $sorter); 
+0

我的服務器只有5.2不幸 – Volmar 2010-09-28 08:21:39

0

的問題是,$ val爲唯一可用的功能sort_movies(範圍內),而不是在CMP的範圍()。你只需要聲明它是全局的。這將把它拉到範圍內,所以你可以在cmp()函數中使用它。

function sort_movies($arr,$val){ 
    function cmp($x, $y) 
    { 
     global $val; // <--------------------------------- 
     if ($x[$val] == $y[$val]) 
      return 0; 
     else if ($x[$val] < $y[$val]) 
      return -1; 
     else 
      return 1; 
    } 
    usort($arr, 'cmp'); 
    return $arr; 
} 

$sorted = sort_movies($arr,"grade"); 

http://php.net/manual/en/language.variables.scope.php