将非静态对象方法与 usort 结合使用


Using a non-static object method with 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()

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

只要需要函数,就可以使用 array(object, functionName) 来调用该对象上的方法。

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

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