Using usort in php with a class private function

PhpArraysSortingObject

Php 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

  1. open the manual page http://www.php.net/usort
  2. see that the type for $value_compare_func is callable
  3. click on the linked keyword to reach http://php.net/manual/en/language.types.callable.php
  4. 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")

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionIbuView Question on Stackoverflow
Solution 1 - PhpDemian BrechtView Answer on Stackoverflow
Solution 2 - PhpdecezeView Answer on Stackoverflow
Solution 3 - PhpJustinView Answer on Stackoverflow
Solution 4 - PhpJames KView Answer on Stackoverflow
Solution 5 - PhphrnskyView Answer on Stackoverflow