Использование usort в php с частной функцией класса

#php #arrays #sorting #object

#php #массивы #сортировка #объект

Вопрос:

хорошо, использовать 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 ()

Ответ №1:

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

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

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

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

Комментарии:

1. Это здорово! Я также хотел бы отметить, что функция сортировки не обязательно должна объявляться неявно как статический метод; поскольку она все еще работает без 🙂

2. @Jimbo — это имеет смысл, поэтому частная функция может использовать переменные экземпляра и класса. Да, это здорово! Также смотрите ответ @deceze, куда вы можете передать $this (аккуратно).

3. Если вы сделаете функцию статической (что вам и следует), вы можете просто написать usort($array, 'ClassName:merchantSort') , не так ли?

4. @MarcoW., Я думаю, что между className и merchantSort не хватает второго ‘:’. Кроме того, если функция используется внутри самого того же класса, я протестировал ее с 'self::merchantSort' , и она работает.

Ответ №2:

  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')

Ответ №3:

Вам нужно передать $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 ) );
  

Ответ №4:

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

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

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

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

Комментарии:

1. Это имеет смысл, только если вы используете эту функцию только в этом одном виде. Во многих случаях одно и то же сравнение используется во многих местах.

2. Это было идеально для того, что мне нужно было сделать. Спасибо!

Ответ №5:

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

Комментарии:

1. static:: вместо имени класса — это то, что мне было нужно, спасибо, что упомянули это.

Ответ №6:

самым простым способом было бы создать функцию arrow, которая вызывает вашу функцию sort следующим образом:

 uasort($array, fn($a, $b) => $this->mySortFunction($a, $b, $optionalAdditionalParam))
  

 private function mySortFunction($a, $b) {
    return -1; // replace with sort logic
}
  

Комментарии:

1. Это кажется разумным, если вы расширяете заданный вопрос. Однако запрашивающий ничего не упомянул о передаче дополнительных параметров методу сортировки.

Ответ №7:

Это сработало у меня, я надеюсь, что это кому-то поможет:

 usort($array, [ClassName::class, "functionName"]);
  

Замените «className» именем вашего PHP-класса и «functionName» именем вашей частной статической функции.

Если все происходит внутри собственного класса, этот тоже работает:

 usort($array, [self::class, "functionName"]);
  

Замените «functionName» именем вашей частной статической функции.