Использование usort в php с классом private function
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 ()
5 ответов:
сделайте вашу функцию сортировки статической:
private static function merchantSort($a,$b) { return ...// the sort }и использовать массив для второго параметра:
$array = $this->someThingThatReturnAnArray(); usort($array, array('ClassName','merchantSort'));
- откройте страницу руководства http://www.php.net/usort
- видим, что тип
$value_compare_funcиcallable- нажмите на связанное ключевое слово, чтобы достичь http://php.net/manual/en/language.types.callable.php
- смотрите, что синтаксис
array($this, 'merchantSort')
вы должны пройти
$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 ) );
в этом примере я сортирую по полю внутри массива под названием AverageVote.
вы можете включить метод внутри вызова, что означает, что у вас больше нет проблемы с областью действия класса, как это...
usort($firstArray, function ($a, $b) { if ($a['AverageVote'] == $b['AverageVote']) { return 0; } return ($a['AverageVote'] < $b['AverageVote']) ? -1 : 1; });
в классе модели Laravel (5.6) я назвал его так, оба метода являются общедоступными статическими, используя php 7.2 на 64-разрядной версии windows.
public static function usortCalledFrom() public static function myFunction()Я позвонил в usortCalledFrom () вот так
usort($array,"static::myFunction")ни один из них не работает
usort($array,"MyClass::myFunction") usort($array, array("MyClass","myFunction")
Comments