-2

如何对以下数组进行排序,以便将房屋排序为红色、绿色和蓝色(乔治:位置 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(),但没有什么能满足我的需要?

编辑:排序需要能够轻松更改。它可以是房屋颜色的任何顺序。使用的顺序只是一个例子。

4

2 回答 2

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

您可以在此处查看一个正在运行的示例。

于 2012-10-30T22:07:05.230 回答
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;
});

如果您可以利用定义而不是依赖字符串作为房屋颜色,则解决方案将更加简单和高效。

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

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;
});
于 2012-10-30T22:29:57.840 回答