【问题标题】:Question about PHP usort function关于PHP usort函数的问题
【发布时间】:2010-09-28 07:24:20
【问题描述】:

我有一个 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" 它确实有效,所以由于某种原因它不允许我发送一个变量作为排序参数。

我做错了什么?

【问题讨论】:

    标签: php usort


    【解决方案1】:

    可以通过发送子键的索引来尝试这个,即等级而不是子键的名称。

    【讨论】:

      【解决方案2】:

      使用 5.3,您可以这样做:

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

      【讨论】:

      • 不幸的是我的服务器只有5.2
      【解决方案3】:

      问题是 $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

      【讨论】:

        猜你喜欢
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        • 2013-09-13
        • 2012-02-14
        • 1970-01-01
        • 2010-11-08
        • 2014-08-20
        • 2014-01-04
        相关资源
        最近更新 更多