Использование usort в php с закрытой функцией класса - PullRequest
111 голосов
/ 19 мая 2011

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

Ответы [ 5 ]

216 голосов
/ 19 мая 2011

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

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

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

$array = $this->someThingThatReturnAnArray();
usort($array, array('ClassName','merchantSort'));
70 голосов
/ 19 мая 2011
  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')
14 голосов
/ 28 марта 2014

Вам необходимо передать $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 ) );
3 голосов
/ 29 июня 2012

В этом примере я сортирую по полю внутри массива AverageVote.

Вы можете включить метод в вызов, что означает, что у вас больше нет проблемы с областью видимости класса, как это ...

        usort($firstArray, function ($a, $b) {
           if ($a['AverageVote'] == $b['AverageVote']) {
               return 0;
           }

           return ($a['AverageVote'] < $b['AverageVote']) ? -1 : 1;
        });
1 голос
/ 04 мая 2018

В классе моделей Laravel (5.6) я назвал это так, оба метода являются общедоступными, используя php 7.2 в 64-битной Windows.1004 *

usort($array,"static::myFunction")

Ни один из них не работал

usort($array,"MyClass::myFunction")
usort($array, array("MyClass","myFunction")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...