Using usort in php with a class private function

后端 未结 5 806
闹比i
闹比i 2020-12-02 07:10

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 ....// stuf         


        
相关标签:
5条回答
  • 2020-12-02 07:48

    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")
    
    0 讨论(0)
  • 2020-12-02 07:52

    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;
            });
    
    0 讨论(0)
  • 2020-12-02 08:05
    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')
    0 讨论(0)
  • 2020-12-02 08:09

    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'));
    
    0 讨论(0)
  • 2020-12-02 08:10

    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 ) );
    
    0 讨论(0)
提交回复
热议问题