PHP“警告:usort()[function.usort]:无效的比较函数”在排序时

4

i have following data as an associative array

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);

但都没有成功。有人能给我提示吗?

2个回答

21

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

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

基本上,您需要发送一个由两个元素组成的数组,而不仅仅是发送函数名称的字符串。第一个元素是上下文(可以在其上找到该方法的对象),而第二个元素是函数名称的字符串。

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

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

1
比较函数是作为全局函数还是对象的方法定义的?如果它是一个方法,你需要稍微改变一下调用方式:
usort($label, array($object, "compare_label")); 

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

public static function compare_label ($a, $b) {
   [...]
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接