Using usort in php with a class private function
PhpArraysSortingObjectPhp Problem Overview
ok using usort with a function is not so complicated
This is what i had before in my linear code
function merchantSort($a,$b){
return ....// stuff;
}
$array = array('..','..','..');
to sort i simply do
usort($array,"merchantSort");
Now we are upgrading the code and removing all global functions and putting them in their appropriate place. Now all the code is in a class and i can't figure out how to use the usort function to sort the array with the parameter that is an object method instead of a simple function
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
...
}
}
The question is how do i call an object method inside the usort() function
Php Solutions
Solution 1 - Php
Make your sort function static:
private static function merchantSort($a,$b) {
return ...// the sort
}
And use an array for the second parameter:
$array = $this->someThingThatReturnAnArray();
usort($array, array('ClassName','merchantSort'));
Solution 2 - Php
- open the manual page http://www.php.net/usort
- see that the type for
$value_compare_func
iscallable
- click on the linked keyword to reach http://php.net/manual/en/language.types.callable.php
- see that the syntax is
array($this, 'merchantSort')
Solution 3 - Php
You need to pass $this
e.g.: usort( $myArray, array( $this, 'mySort' ) );
Full example:
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 ) );
Solution 4 - Php
In this example I am sorting by a field inside the array called AverageVote.
You could include the method inside the call, which means you no longer have the class scope problem, like this...
usort($firstArray, function ($a, $b) {
if ($a['AverageVote'] == $b['AverageVote']) {
return 0;
}
return ($a['AverageVote'] < $b['AverageVote']) ? -1 : 1;
});
Solution 5 - Php
In Laravel (5.6) model class, I called it like this, both methods are public static, using php 7.2 on windows 64 bit.
public static function usortCalledFrom()
public static function myFunction()
I did call in usortCalledFrom() like this
usort($array,"static::myFunction")
None of these were work
usort($array,"MyClass::myFunction")
usort($array, array("MyClass","myFunction")