【问题标题】:PHP "Warning: usort() [function.usort]: Invalid comparison function" on sortingPHP“警告:usort()[function.usort]:无效的比较函数”排序
【发布时间】:2010-11-16 18:59:20
【问题描述】:

我有以下数据作为关联数组

array
  'abc' => 
    array
      'label' => string 'abc' (length=3)
      'weight' => float 3
  'wsx' => 
    array
      'label' => string 'wsx' (length=3)
      'weight' => float 1
  'qay' => 
    array
      'label' => string 'qay' (length=3)
      'weight' => float 1
  'http://test.com' => 
    array
      'label' => string 'http://test.com' (length=15)
      'weight' => float 0
  'Nasi1' => 
    array
      'label' => string 'Nasi1' (length=5)
      'weight' => float 0
  'fax' => 
    array
      'label' => string 'fax' (length=3)
      'weight' => float 4

我想使用“标签”或“权重”对数组进行排序

标签的比较函数是:

function compare_label($a, $b)
{
    return strnatcmp($a['label'], $b['label']);
}

我只是从另一个函数调用该函数:

usort($label, 'compare_label');
var_dump($label);

但随后我收到错误消息并且数组未排序。我不知道,我做错了什么。我试图替换:

  • usort($label, 'compare_label');usort($label, compare_label);
  • usort($label, 'compare_label');usort($label, $this->compare_label);

没有成功。谁能给我一个提示?

【问题讨论】:

    标签: php sorting associative-array warnings


    【解决方案1】:

    如果compare_label 是成员函数(即类方法),那么您需要以不同的方式传递它。

    usort( $label, array( $this, 'compare_label' ) );
    

    基本上,不是只发送函数名称的字符串,而是发送一个二元素数组,其中第一个元素是上下文(可以在其上找到方法的对象),第二个元素是字符串函数名。

    注意:如果你的方法是静态的,那么你将类名作为数组的第一个元素传递

    usort( $label, array( __CLASS__, 'compare_label' ) );
    

    【讨论】:

      【解决方案2】:

      比较函数是定义为全局函数还是对象的方法?如果它是一种方法,则必须稍微更改调用方式:

      usort($label, array($object, "compare_label")); 
      

      您也可以将其声明为类本身的静态方法:

      public static function compare_label ($a, $b) {
         [...]
      }
      
      usort($label, array(Class_Name, "compare_label"));
      

      【讨论】:

        猜你喜欢
        • 2012-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-09
        相关资源
        最近更新 更多