Двойная сортировка массива в PHP - PullRequest
3 голосов
/ 29 ноября 2010

Мне нужно отсортировать массив в PHP, а затем отсортировать по его второму индексу, если первый индекс такой же.Позвольте мне объяснить:

Элементы будут расположены случайным образом:

(2,1),(4,4),(2,9),(4,8),(2,35),(2,1),(2,35),(4,4),(4,25),(4,4)

Мне нужно было бы сначала отсортировать их по первому числу.так что результат будет:

(2,1),(2,9),(2,1),(2,35),(4,4),(4,8),(4,4),(4,25),(4,4)

Теперь вы можете видеть, что все элементы сгруппированы по первому индексу вместе.Теперь мне нужно сгруппировать по второму индексу "WITHIN" текущую группировку.Сделайте так, чтобы это выглядело так:

(2,1),(2,1),(2,9),(2,35),(4,4),(4,4),(4,4),(4,8),(4,25)

Это было просто простое представление массива.Фактический массив приведен ниже:

Array
(
    [0] => Array
        (
            [practice_id] => 119
            [practice_location_id] => 173
        )

    [1] => Array
        (
            [practice_id] => 2
            [practice_location_id] => 75
        )

    [2] => Array
        (
            [practice_id] => 18
            [practice_location_id] => 28
        )

    [3] => Array
        (
            [practice_id] => 119
            [practice_location_id] => 174
        )

    [4] => Array
        (
            [practice_id] => 119
            [practice_location_id] => 173
        )

    [5] => Array
        (
            [practice_id] => 2
            [practice_location_id] => 75
        )

    [6] => Array
        (
            [practice_id] => 119
            [practice_location_id] => 174
        )

    [7] => Array
        (
            [practice_id] => 18
            [practice_location_id] => 28
        )

    [8] => Array
        (
            [practice_id] => 18
            [practice_location_id] => 27
        )
)

Был бы очень признателен за помощь.

Ответы [ 4 ]

6 голосов
/ 29 ноября 2010

Используйте usort с пользовательской функцией сравнения, которая сортирует по первому полю, но если они равны, сортирует по второму полю:

function my_compare($a, $b) {
  if ($a['practice_id'] == $b['practice_id'])
    return $a['practice_location_id'] - $b['practice_location_id'];
  else
    return $a['practice_id'] - $b['practice_id'];
}
2 голосов
/ 29 ноября 2010
function compare_callback($x, $y) {
    if ($x['practice_id'] < $y['practice_id'])
        return 1;
    if ($x['practice_id'] > $y['practice_id'])
        return -1;
    if ($x['practice_id'] == $y['practice_id']) {
        if ($x['practice_location_id'] < $y['practice_location_id'])
            return 1;
        if ($x['practice_location_id'] > $y['practice_location_id'])
            return -1;
        if ($x['practice_location_id'] == $y['practice_location_id'])
            return 0;
    }
}

Используйте этот метод с usort ()

http://php.net/usort

1 голос
/ 29 ноября 2010

Этот обратный вызов использует то, что я только что узнал из ответа @ casablanca, и помещает его в цикл. Таким образом, сравниваются не только два, но и столько ключей для сравнения.

function sort_callback($x, $y)
    foreach ($x as $key => $value) {
        if ($x[$key] != $y[$key])
            return $x[$key] - $y[$key];
    }
    return 0;
}

Как уже говорилось, передайте эту функцию в качестве обратного вызова usort ().

http://php.net/usort

1 голос
/ 29 ноября 2010

Вы можете использовать функцию PHP usort() :

function someCompareFunction($a, $b) {
    $order = array('practice_id', 'practice_location_id');

    foreach ($order as $key) {
        if (isset($a[$key]) && isset($b[$key]) && $a[$key] != $b[$key]) {
            return $a[$key] - $b[$key];
        }
    }

    return 0;
}

usort($yourArray, 'someCompareFunction');

Начиная с PHP 5.3 возможно следующее:

usort($yourArray, function($a, $b) {
    // comparison code
});

Вы можете сделатьФункция сравнения настолько сложна, насколько вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...