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?
  • Вопрос задан
  • 57 просмотров
Решения вопроса 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

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

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

Похожие вопросы