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

639   5  

5 ответов:

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

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;
        });

в классе модели 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

    Ничего не найдено.