在PHP中对数组进行双重排序

时间:2010-11-28 21:32:53

标签: php sorting

我需要在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 个答案:

答案 0 :(得分:6)

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'];
}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您可以使用PHP的usort()-function

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
});

您可以根据需要使比较功能变得复杂。

答案 3 :(得分:1)

这个回调使用我刚刚从@ 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