Сортировка массива с использованием usort и динамически генерируемой функции - PullRequest
1 голос
/ 25 января 2012

Я использую функцию php usort для сортировки массива.Пользовательская функция php должна быть сгенерирована, потому что ее динамическая

$intCompareField = 2;
$functSort = function($a, $b) {
  return ($a[$intCompareField] > $a[$intCompareField])?1:-1;
}

usort($arrayToSort, $functSort);

$intCompareField в функции сравнения равна нулю, я предполагаю, потому что $intCompareField был объявлен вне функции.Установка global $intCompareField, похоже, не работает.

Ps: я использую $intCompareField, потому что сортируемый массив является многомерным, и я хочу иметь возможность, какой ключ в массиве сортировать.

Ответы [ 2 ]

3 голосов
/ 25 января 2012

В то время как ответа Дор Шемер будет достаточно, я считаю, что часто лучше иметь функцию, которая генерирует требуемую функцию сравнения.

$functSort = function ($field) {
    return function($a, $b) use ($field) {
        // Do your comparison here
    };
};

$intCompareField = 2;
usort($arrayToSort, $functSort($intCompareField));

Вы можете сделать эту функцию в $functSortбыть именованной функцией (например, sort_by_field_factory() или другим подходящим именем), для нее не требуется анонимная функция.

3 голосов
/ 25 января 2012

Попробуйте добавить use, который передает переменные из внешней области в анонимные функции

function($a, $b) use ($intCompareField) {
     return ($a[$intCompareField] > $a[$intCompareField])?1:-1;
}
...