#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:
- откройте страницу руководства http://www.php.net/usort
- смотрите, что тип для
$value_compare_func
равенcallable
- нажмите на связанное ключевое слово, чтобы перейти http://php.net/manual/en/language.types.callable.php
- убедитесь, что синтаксис
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» именем вашей частной статической функции.