Использование 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 ()

Сделайте свою функцию сортировки статической:

 private static function merchantSort($a,$b) { return ...// the sort } 

И используйте массив для второго параметра:

 $array = $this->someThingThatReturnAnArray(); usort($array, array('ClassName','merchantSort')); 
  1. откройте страницу руководства http://www.php.net/usort
  2. см., что тип для $value_compare_func является callable
  3. нажмите на связанное ключевое слово, чтобы достичь http://php.net/manual/en/language.types.callable.php.
  4. см., что синтаксисом является 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; });