关于PHP usort函数的问题

时间:2010-09-28 07:24:20

标签: php usort

我有一个PHP脚本,我使用usort()函数重新排列多维数组。

这是数组$ arr

的示例数组(print_r-output)
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");

我希望能够在不同的子键(即名称,等级,ID)上对数组进行排序,但它不能像我上面那样工作。但是,如果我将排序电影功能中的$val更改为值"grade",它确实有效,因此由于某种原因,它不允许我作为排序参数发送变量。

我做错了什么?

3 个答案:

答案 0 :(得分:0)

可以通过发送子项索引(即成绩而不是子项名称)来尝试此操作。

答案 1 :(得分: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);

答案 2 :(得分: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