Використання usort у php з приватною функцією класу


119

ОК, використовуючи 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 ()

Відповіді:


228

Зробіть функцію сортування статичною:

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

І використовувати масив для другого параметра:

$array = $this->someThingThatReturnAnArray();
usort($array, array('ClassName','merchantSort'));

2
Це чудово! Я також хотів би зазначити, що функцію сортування не потрібно оголошувати неявно статичним методом; як це все ще працює без :)
Jimbo

@Jimbo - це має сенс, тому приватна функція може використовувати змінні інстанції та класу. Так, це чудово! Також дивіться відповідь @deceze, куди можна пройти $this(неато).
Бен

5
Якщо ви зробите функцію статичною (яку ви повинні), ви можете просто писати usort($array, 'ClassName:merchantSort'), чи не так?
каре

8
Людині це здається таким дивним способом це зробити. Ой PHP, як ми тебе любимо.
dudewad

12
@MarcoW. Я думаю, що між ClassName та merchantSort є відсутні другий ':'. Крім того, якщо функція використовується всередині самого класу, я перевірив її 'self::merchantSort'і вона працює.
Пер


21

Вам потрібно пройти, $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 ) );

Другий розділ зараз набагато кращий. Але у вашому першому прикладі все ще немає ")".
codecribblr

5

У цьому прикладі я сортую за полем всередині масиву під назвою AverageVote.

Ви можете включити метод всередині виклику, а це означає, що у вас більше не виникає проблеми з областю класу, як це ...

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

           return ($a['AverageVote'] < $b['AverageVote']) ? -1 : 1;
        });

1
Це має сенс лише в тому випадку, якщо ви використовуєте цю функцію лише в цьому виді. У багатьох випадках одне порівняння використовується в багатьох місцях.
шовк

1
Це було ідеально для того, що мені потрібно було зробити. Дякую!
Крістофер Сміт

3

У модельному класі 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")

static::замість назви класу - це те, що мені було потрібно, дякую, що згадав про це.
Щирий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.