PHP中对数组进行双重排序

4
我需要在 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
        )
)

非常感谢您的帮助。

2
你确定需要在PHP中对此进行排序吗?如果你从某种数据库获取数据,那么在那里进行排序会更简单。 - Piskvor left the building
不行,必须用PHP完成。 - YD8877
4个回答

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或1。好知道。 - Jonah
@Jonah Bron:这就是C语言中strcmp的工作方式,而且它已经延续到许多其他编程语言中。 - casablanca
你的意思是 strcmp 只允许返回 -1、0 或 +1 吗?还是反过来? - Jonah
@Jonah Bron:不,我的意思是strcmp根据比较返回任何负数、零或正数的值。 - casablanca

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


以这种方式看待它真的帮了很多 :) - Sam Holguin

1

您可以使用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
});

您可以将比较函数编写得尽可能复杂。

不错,但它没有回答如何比较次级水平。 - Jonah
@Jonah Bron:我已经添加了;) - jwueller

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接