Вопрос о PHP usort-функции - PullRequest
       3

Вопрос о PHP usort-функции

1 голос
/ 28 сентября 2010

У меня есть PHP-скрипт, в котором я перестраиваю многомерный массив с помощью функции usort () -.

это примерный массив (print_r-output) массива $ arr

Array
(
    [3] => Array
        (
            [name] => Bjudningen
            [grade] => 5
            [grade_type] => calculated
            [orgname] => LInvitation
            [id] => 13975
        )

    [0] => Array
        (
            [name] => Coeur fidèle
            [grade] => 3
            [grade_type] => calculated
            [orgname] => Coeur fidèle
            [id] => 8075
        )

    [2] => Array
        (
            [name] => Dawsonpatrullen
            [grade] => 5
            [grade_type] => calculated
            [orgname] => The Dawson Patrol
            [id] => 13083
        )

)

И это мой PHP-скрипт

function sort_movies($arr,$val){
  function cmp($x, $y)
  {
    if ( $x[$val] == $y[$val] )
      return 0;
    else if ( $x[$val] < $y[$val] )
      return -1;
    else
      return 1;
  }
  usort($arr, 'cmp');
  return $arr;
}

$sorted = sort_movies($arr,"grade");

Я хочу иметь возможность сортировать массив по различным подразделам (например, имя, класс, идентификатор), но это не работаетЯ делаю это выше.однако, если я изменю $val в функции сортировки фильмов на значение "grade", это сработает, поэтому по какой-то причине он не позволит мне отправить переменную в качестве параметра сортировки.

это я делаю не так?

Ответы [ 3 ]

0 голосов
/ 28 сентября 2010

С 5.3 вы можете сделать это так:

function create_sort($key)
{
    return function($x,$y) use($key)
    {
        return $x[$key] - $y[$key];
    };
}
$sorter = create_sort('name');
usort($arr, $sorter);
0 голосов
/ 29 сентября 2010

Проблема в том, что $ val доступен только в области видимости функции sort_movies (), но не в области видимости cmp ().Вам нужно просто объявить его как глобальный.Это приведет к тому, что вы сможете использовать его в функции cmp ().

function sort_movies($arr,$val){
    function cmp($x, $y)
    {
        global $val; // <---------------------------------
        if ( $x[$val] == $y[$val] )
            return 0;
        else if ( $x[$val] < $y[$val] )
            return -1;
        else
            return 1;
    }
    usort($arr, 'cmp');
    return $arr;
}

$sorted = sort_movies($arr,"grade");

http://php.net/manual/en/language.variables.scope.php

0 голосов
/ 28 сентября 2010

Может быть попробовать это, отправив индекс подраздела, то есть оценку вместо имени подраздела.

...