Allegro75
@Allegro75
SummaryTables.ru - сайт с футбольной статистикой

Как правильно написать название функции в аргументе uasort?

У меня php-файл примерно такого вида:

class ReportController extends Controller
{
    public function complements()
    {
        $dishes = 
             [
                  'a' => ['count' => 200, 'more' => 'qwerty'],
                  'b' => ['count' => 300, 'more' => 'qwerty'],
                  'c' => ['count' => 100, 'more' => 'qwerty'],
             ];
    }
}


Мне надо внутри функции complements отсортировать массив $dishes так, чтобы параметр count шёл, скажем, по убыванию.
Сразу после массива $dishes добавляю код:
function cmp($a, $b)
		{
			return ( (int)$a['count'] <= (int)$b['count'] ) ? -1 : 1;
		}
		uasort($dishes, 'cmp');


Мне пишут:
Warning: uasort() expects parameter 2 to be a valid callback, function 'cmp' not found or invalid function name in ...

Сортировки не происходит.

Я так понял, это от того, что имя функции 'cmp' (в аргументах uasort) задано неверно.
Пробовал '$this->cmp', не помогло.
Как правильно написать название функции cmp в аргументе uasort?
  • Вопрос задан
  • 55 просмотров
Решения вопроса 2
@galaxy
В современном PHP можно просто:
uasort($dishes, function ($a, $b) {
      return ( (int)$a['count'] <= (int)$b['count'] ) ? -1 : 1;
    });


Чтобы строкой передавать название функции, она должна быть в глобальной области видимости.
Ответ написан
DevMan
@DevMan
class ReportController {
    public function complements()
    {
        $dishes = 
             [
                  'a' => ['count' => 200, 'more' => 'qwerty'],
                  'b' => ['count' => 300, 'more' => 'qwerty'],
                  'c' => ['count' => 100, 'more' => 'qwerty'],
             ];
		
		uasort($dishes, [self::class, 'cmp']);
		print_r($dishes);
    }
	
	private function cmp($a, $b) {
		return $a <=> $b;
	}
}
	
(new ReportController)->complements();
https://ideone.com/IuCL8i

хотя проще сделать через замыкание.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
24 апр. 2024, в 22:00
500 руб./в час
24 апр. 2024, в 21:49
10000 руб./за проект