在PHP中按多个键对数组排序

在PHP中按多个键对数组排序,php,arrays,sorting,Php,Arrays,Sorting,我有一个表/数组。例如,在Excel中,我可以按第1列asc、第2列desc、第3列asc等进行排序 我可以用PHP做同样的事情吗?首先使用[“名字”]ASC,然后使用[“姓氏”]DESC,[“玩家id”]ASC和[“用户id”]DESC 数组(2){ [0]=>阵列(6){ [0]=>字符串(8)“John”, [“名字”]=>字符串(8)“约翰”, [1] =>int(7)“44”, [“分数”]=>int(7)“44”, [2] =>字符串(2)“7”, [“玩家id”]=>字符串(2)“

我有一个表/数组。例如,在Excel中,我可以按第1列asc、第2列desc、第3列asc等进行排序

我可以用PHP做同样的事情吗?首先使用
[“名字”]ASC
,然后使用
[“姓氏”]DESC
[“玩家id”]ASC
[“用户id”]DESC

数组(2){
[0]=>阵列(6){
[0]=>字符串(8)“John”,
[“名字”]=>字符串(8)“约翰”,
[1] =>int(7)“44”,
[“分数”]=>int(7)“44”,
[2] =>字符串(2)“7”,
[“玩家id”]=>字符串(2)“7”,
[3] =>字符串(2)“3”,
[“用户id”]=>字符串(2)“3”
},
[1] =>阵列(6){
[0]=>字符串(5)“Sam”,
[“名字”]=>字符串(5)“山姆”,
[1] =>int(7)“55”,
[“分数”]=>int(7)“55”,
[2] =>字符串(2)“1”,
[“玩家id”]=>字符串(2)“1”,
[3] =>字符串(2)“6”,
[“用户id”]=>字符串(2)“61”
}
}
(实际上,阵列更长、更深,这只是一个示例。)

更新:

函数byPlayerID($player,$compare){
如果($player['player\u id']>$compare['player\u id']))
返回1;//上移
else if($player['player\u id']<$compare['player\u id']))
return-1;//下移
其他的
返回0;//不执行任何操作
如果($player['score']>$compare['score'])
返回1;//上移
否则如果($player['score']<$compare['score']))
return-1;//下移
其他的
返回0;//不执行任何操作
}
更新2:没关系,我只需要删除
返回0

根据需要使用PHP函数比较值。扩展回调函数以比较多个值。

根据需要使用PHP函数比较值。扩展回调函数以比较多个值。

使用()

例如:

$byPlayerID = function($player, $compare) {
  if($player['player_id'] > $compare['player_id'])
    return 1; // move up
  else if($player['player_id'] < $compare['player_id'])
    return -1; // move down
  else
    return 0; // do nothing
};

usort($players, $byPlayerID);
// now $players is sorted!
$byPlayerID=函数($player,$compare){
如果($player['player\u id']>$compare['player\u id']))
返回1;//上移
else if($player['player\u id']<$compare['player\u id']))
return-1;//下移
其他的
返回0;//不执行任何操作
};
usort($players,$byPlayerID);
//现在$players已排序!
不过,这确实需要PHP5.3,下面是一个更向后兼容的版本

函数byPlayerID($player,$compare){
如果($player['player\u id']>$compare['player\u id']))
返回1;//上移
else if($player['player\u id']<$compare['player\u id']))
return-1;//下移
其他的
返回0;//不执行任何操作
}
usort($players,“byPlayerID”);
使用()

例如:

$byPlayerID = function($player, $compare) {
  if($player['player_id'] > $compare['player_id'])
    return 1; // move up
  else if($player['player_id'] < $compare['player_id'])
    return -1; // move down
  else
    return 0; // do nothing
};

usort($players, $byPlayerID);
// now $players is sorted!
$byPlayerID=函数($player,$compare){
如果($player['player\u id']>$compare['player\u id']))
返回1;//上移
else if($player['player\u id']<$compare['player\u id']))
return-1;//下移
其他的
返回0;//不执行任何操作
};
usort($players,$byPlayerID);
//现在$players已排序!
不过,这确实需要PHP5.3,下面是一个更向后兼容的版本

函数byPlayerID($player,$compare){
如果($player['player\u id']>$compare['player\u id']))
返回1;//上移
else if($player['player\u id']<$compare['player\u id']))
return-1;//下移
其他的
返回0;//不执行任何操作
}
usort($players,“byPlayerID”);
是您正在寻找的函数

下面是一个使用array_multisort编写的示例函数

使用

   $sorted_arraty = sort_array_multidim($array,"first_name ASC, last_name DESC, player_id ASC, user_id DESC");
是您正在寻找的函数

下面是一个使用array_multisort编写的示例函数

使用

   $sorted_arraty = sort_array_multidim($array,"first_name ASC, last_name DESC, player_id ASC, user_id DESC");

对于那些在将来发现这一点的人,这里有一个最终的工作版本,它完全回答了最初的问题。这将按四个不同的键值进行排序

$byPlayerID = function($a, $b) {

  // Sort by first
  // > to return 1, < to return -1 = ASC order
  if($a['first_name'] > $b['first_name']) return 1; // move up
  else if($a['first_name'] < $b['first_name']) return -1; // move down

  // Sort by second
  // < to return 1, > to return -1 = DESC order
  if($a['last_name'] < $b['last_name']) return 1; // move up
  else if($a['last_name'] > $b['last_name']) return -1; // move down

  // Sort by third
  // > to return 1, < to return -1 = ASC order
  if($a['player_id'] > $b['player_id']) return 1; // move up
  else if($a['player_id'] < $b['player_id']) return -1; // move down

  // Sort by fourth
  // < to return 1, > to return -1 = DESC order
  if($a['user_id'] < $b['user_id']) return 1; // move up
  else if($a['user_id'] > $b['user_id']) return -1; // move down

  else return 0; // do nothing

};

usort($stats, $byPlayerID);
$byPlayerID=函数($a,$b){
//先分类
//>返回1,<返回-1=ASC订单
if($a['first\u name']>$b['first\u name'])返回1;//上移
else if($a['first\u name']<$b['first\u name'])返回-1;//下移
//按秒排序
//<返回1,>返回-1=描述顺序
if($a['last\u name']<$b['last\u name'])返回1;//上移
else if($a['last_name']>$b['last_name'])返回-1;//下移
//按三分之一排序
//>返回1,<返回-1=ASC订单
如果($a['player\u id']>b['player\u id'])返回1;//上移
else if($a['player\u id']<$b['player\u id'])返回-1;//下移
//按第四名排序
//<返回1,>返回-1=描述顺序
if($a['user\u id']<$b['user\u id'])返回1;//上移
else if($a['user\u id']>$b['user\u id'])返回-1;//下移
else返回0;//不执行任何操作
};
usort($stats$byPlayerID);

对于那些在将来发现这一点的人,这里有一个最终的工作版本,它完全回答了最初的问题。这将按四个不同的键值进行排序

$byPlayerID = function($a, $b) {

  // Sort by first
  // > to return 1, < to return -1 = ASC order
  if($a['first_name'] > $b['first_name']) return 1; // move up
  else if($a['first_name'] < $b['first_name']) return -1; // move down

  // Sort by second
  // < to return 1, > to return -1 = DESC order
  if($a['last_name'] < $b['last_name']) return 1; // move up
  else if($a['last_name'] > $b['last_name']) return -1; // move down

  // Sort by third
  // > to return 1, < to return -1 = ASC order
  if($a['player_id'] > $b['player_id']) return 1; // move up
  else if($a['player_id'] < $b['player_id']) return -1; // move down

  // Sort by fourth
  // < to return 1, > to return -1 = DESC order
  if($a['user_id'] < $b['user_id']) return 1; // move up
  else if($a['user_id'] > $b['user_id']) return -1; // move down

  else return 0; // do nothing

};

usort($stats, $byPlayerID);
$byPlayerID=函数($a,$b){
//先分类
//>返回1,<返回-1=ASC订单
if($a['first\u name']>$b['first\u name'])返回1;//上移
else if($a['first\u name']<$b['first\u name'])返回-1;//下移
//按秒排序
//<返回1,>返回-1=描述顺序
if($a['last\u name']<$b['last\u name'])返回1;//上移
else if($a['last_name']>$b['last_name'])返回-1;//下移
//按三分之一排序
//>返回1,<返回-1=ASC订单
如果($a['player\u id']>b['player\u id'])返回1;//上移
else if($a['player\u id']<$b['player\u id'])返回-1;//下移
//按第四名排序
//<返回1,>返回-1=描述顺序
if($a['user\u id']<$b['user\u id'])返回1;//上移
else if($a['user\u id']>$b['user\u id'])返回-1;//下移
else返回0;//不执行任何操作
};
usort($stats$byPlayerID);

我知道usort()只是不知道如何在这种特殊情况下使用它。请记住,如果在多维上下文中使用usort,则检索数组。这是一个很难把握和想象的概念。()手册中有一些很好的例子。@redacted,上面的例子以您给定的格式获取一个数组,并根据玩家id对其进行排序。这对每一列都有效,但w