2014-12-23 5 views
0

Я пытаюсь сортировать массив значений с помощью метода класса. Значения следующиеИспользование метода нестатического объекта с 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); 
}); 

Ошибка я получаю Фатальная ошибка: Вызов функции члена рода() на не-объект

Отпускаю я могу создать новый экземпляр объекта внутри анонимной функции, но Я не хочу каждый раз запрашивать базу данных. Есть ли способ использовать мой класс для сортировки этих значений?

+0

Почему вы не можете вызвать вызов 'usort()' внутри класса? – tyteen4a03

+0

Группа $ agegroups поступает из другого datsource. – Robbert

+0

Итак, передайте последний массив '$ agegroups' в функцию, которая будет' usort' массива. – tyteen4a03

ответ

1

Везде, где требуется функция, вы можете использовать array(object, functionName) для вызова метода на этом объекте.

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

Кстати, вы не должны присвоить результат usort обратно agegroups. Функции сортировки изменяют массив на месте; они возвращают логический, а не переупорядоченный массив.

+0

Спасибо. Это отлично поработало. – Robbert

Смежные вопросы