我正在尝试使用类方法对值数组进行排序。值如下
$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()
我发布我可以在匿名函数中创建对象的新实例,但我不想每次都要查询数据库。有没有办法使用我的类对这些值进行排序?
答案 0 :(得分:1)
无论何处需要函数,您都可以使用array(object, functionName)
来调用该对象上的方法。
usort($agegroups, array($agObj, 'sort'));
顺便说一句,您不应将usort
的结果分配回agegroups
。排序函数修改了数组;它们返回一个布尔值,而不是重新排序的数组。