Использование usort в php с частной функцией класса
ok с использованием функции usort с функцией не так сложно
Это то, что я имел в своем линейном коде
function merchantSort($a,$b){
return ....// stuff;
}
$array = array('..','..','..');
для сортировки я просто делаю
usort($array,"merchantSort");
Теперь мы обновляем код и удаляем все глобальные функции и помещаем их в соответствующее место. Теперь весь код находится в классе, и я не могу понять, как использовать функцию usort для сортировки массива с параметром, являющимся объектным методом, вместо простой функции
class ClassName {
...
private function merchantSort($a,$b) {
return ...// the sort
}
public function doSomeWork() {
...
$array = $this->someThingThatReturnAnArray();
usort($array,'$this->merchantSort'); // ??? this is the part i can't figure out
...
}
}
Вопрос в том, как вызвать метод объекта внутри функции usort()
Ответы
Ответ 1
Сделайте свою функцию сортировки статической:
private static function merchantSort($a,$b) {
return ...// the sort
}
И используйте массив для второго параметра:
$array = $this->someThingThatReturnAnArray();
usort($array, array('ClassName','merchantSort'));
Ответ 2
Ответ 3
Вам нужно пройти $this
например: usort( $myArray, array( $this, 'mySort' ) );
Полный пример:
class SimpleClass
{
function getArray( $a ) {
usort( $a, array( $this, 'nameSort' ) ); // pass $this for scope
return $a;
}
private function nameSort( $a, $b )
{
return strcmp( $a, $b );
}
}
$a = ['c','a','b'];
$sc = new SimpleClass();
print_r( $sc->getArray( $a ) );
Ответ 4
В этом примере я сортирую по полю внутри массива с именем AverageVote.
Вы можете включить метод внутри вызова, что означает, что у вас больше нет проблемы с классом, например...
usort($firstArray, function ($a, $b) {
if ($a['AverageVote'] == $b['AverageVote']) {
return 0;
}
return ($a['AverageVote'] < $b['AverageVote']) ? -1 : 1;
});