排序多维数组PHP

时间:2012-10-30 22:05:10

标签: php sorting multidimensional-array

如何对以下数组进行排序,以便对房屋进行红色,绿色和蓝色排序(乔治:位置0,史蒂夫:位置[1]和弗雷德:位置[2])?

Array
(
    [catOne] => Array
        (
            [0] => Array
                (
                    [Opponent] => Steve
                    [House_Colour] => Green
                )

            [1] => Array
                (
                    [Opponent] => Fred 
                    [House_Colour] => Blue
                )

            [2] => Array
                (
                    [Opponent] => George 
                    [House_Colour] => Red
                )
        )

    [catTwo] => Array
        (
            [0] => Array
                (
                    [Opponent] => Peter 
                    [House Colour] => Green
                )

        )

)

我尝试过使用sort(),asort()和usort(),但我没需要什么呢?

编辑:分类需要能够轻松更改。它可以是House颜色的任何顺序。使用的订单只是一个例子。

2 个答案:

答案 0 :(得分:2)

您可能需要尝试usort。它允许您对指定自定义回调函数的数组进行排序。由于您没有明确说明您希望对项目进行排序的标准,因此我无法真正帮助您完成此功能。 (我的猜测是House_ColourRed > Green > Blue以来的字母顺序反向,但我不确定您是否还有其他我忽略的标准。)

这个简单的比较功能按照您指定的顺序按照颜色对颜色进行排序,并且很容易修改为您真正想要的颜色。每种颜色都有一个可以为自己分配的等级(您也可以轻松添加新颜色),也可以通过翻转else if部分中的比较运算符来轻松更改顺序。

function cmp($a, $b) {
    $colors = Array('RED' => 3, 'GREEN' => 2, 'BLUE' => 1);
    // A is ranked same as B
    if ($colors[$a['House_Colour']] == $colors[$b['House_Colour']]) {
        return 0;
    }
    // A is ranked above B
    else if ($colors[$a['House_Colour']] > $colors[$b['House_Colour']]) {
        return 1;
    }
    // A is ranked below B
    else {
        return -1;
    }
}

您可以看到正在运行的示例here

答案 1 :(得分:1)

如果我了解您需要做什么,可以使用usort

usort($array, function($a, $b) {
    $sort = array('Red', 'Green', 'Blue');
    if (array_search($a['House_Colour'], $sort) > array_search($b['House_Colour'], $sort)) return 1;
    if (array_search($a['House_Colour'], $sort) < array_search($b['House_Colour'], $sort)) return -1;
    return 0;
});

如果您可以利用定义而不是依赖于房屋颜色的字符串,那么解决方案将变得更加简单和高效。

您应该在静态类中定义House颜色(以模拟枚举类型)

Class HouseColour {
    const Red = 0;
    const Green = 1;
    const Blue = 2;
}

在这种情况下,你必须申报一个对手/球员

 $opponent = array ( 'Opponent'=>'Steve', 'House_Colour'=>HouseColour::Green);

如果你对类和静态常量不相容(你应该很容易与它们相容,因为它们的好处真的很棒)你可以求助于一系列定义

define ('HC_Red',0);
define ('HC_Green', 1);
define ('HC_Blue', 2);

对手成为

 $opponent = array ( 'Opponent'=>'Steve', 'House_Colour'=>HC_Green);

在两种情况下,usort函数都是相同的:

usort($array, function($a, $b) {
    if ($a['House_Colour'] > $b['House_Colour']) return 1;
    if ($a['House_Colour'] < $b['House_Colour']) return -1;
    return 0;
});