使用带有usort的非静态对象方法

时间:2014-12-23 07:22:27

标签: php usort

我正在尝试使用类方法对值数组进行排序。值如下

$agegroups = array("08","910","1112","1314","1516","1718","1999");

但是,它们可以是数字的任意组合。上面的值对应于我的网站上使用的年龄组,并且是在数据库表中定义的,所以我不能对它们进行硬编码。我有一个包含一系列年龄组定义的对象,比如这个

private $agegroups = array();

function __construct() {
  // retrieve data from the database
  while($data = $sth->fetch()) {
    $ag = new StdClass();
    $ag->low = $data['low'];   //stores the low end of the age group
    $ag->high = $data['high']  //stores the high end of the age group
    $this->agegroups[$data['key']] = $ag;
  }
}

$data['key']对应于上面定义的$agegroups数组。在同一个类中,我定义了一个排序方法

function sort($a,$b) {
  $aAG = $this->agegroups[$a];
  $bAG = $this->agegroups[$b];

  return $aAG->low > $bAG->low ? 1 : -1;
}

我的理解是usort只能使用静态方法。但是我的对象需要从数据库中检索值,因此我无法将其设置为静态。

我尝试使用带有usort的匿名函数,该函数可以使用函数外部定义的类的实例,但是我得到一个关于未定义对象的错误。

$agObj = new agegroups();
$agegroups = usort($agegroups, function($a, $b){
  global $agObj;
  return $agObj->sort($a,$b);
});

我得到的错误是致命错误:在非对象上调用成员函数sort()

我发布我可以在匿名函数中创建对象的新实例,但我不想每次都要查询数据库。有没有办法使用我的类对这些值进行排序?

1 个答案:

答案 0 :(得分:1)

无论何处需要函数,您都可以使用array(object, functionName)来调用该对象上的方法。

usort($agegroups, array($agObj, 'sort'));

顺便说一句,您不应将usort的结果分配回agegroups。排序函数修改了数组;它们返回一个布尔值,而不是重新排序的数组。