如何对以下数组进行排序,以便对房屋进行红色,绿色和蓝色排序(乔治:位置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颜色的任何顺序。使用的订单只是一个例子。
答案 0 :(得分:2)
您可能需要尝试usort
。它允许您对指定自定义回调函数的数组进行排序。由于您没有明确说明您希望对项目进行排序的标准,因此我无法真正帮助您完成此功能。 (我的猜测是House_Colour
自Red > 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;
});