PHP 对二维数组指定的 key 排序

序言

项目中需要对查询结果进行排序,由于查询结果是分两次,无法使用mysql的orderBy排序,网站找了点资料,这里稍微汇总下,

开始

我们先来看一个函数array_multisort,官方文档给出的解释是:

对多个数组或多维数组进行排序,排序结果是所有的数组都按第一个数组的顺序进行排列。

两个数组的元素个数必须相同,不然就会出现一个警告信息:

Warning: array_multisort() [function.array-multisort]: Array sizes are inconsistent in …

我们使用这个函数排序结果是所有的数组都按第一个数组的顺序进行排列特性对二位数组进行排序。

下面是一个小demo:

array (size=5)
  0 => 
    array (size=6)
      'title' => string '搞笑' (length=6)
      'recommend' => string '0' (length=1)
      'tagCount' => string '0' (length=1)
      'useCount' => string '0' (length=1)
      'userMarkCount' => int 0
  1 => 
    array (size=6)
      'title' => string '心理专家' (length=12)
      'recommend' => string '1' (length=1)
      'tagCount' => string '0' (length=1)
      'useCount' => string '0' (length=1)
      'userMarkCount' => int 0
  2 => 
    array (size=6)
      'title' => string '黄段子' (length=9)
      'recommend' => string '0' (length=1)
      'tagCount' => string '3' (length=1)
      'useCount' => string '19' (length=2)
      'userMarkCount' => int 13
  3 => 
    array (size=6)
      'title' => string ' 不一样的搞笑' (length=19)
      'recommend' => string '1' (length=1)
      'tagCount' => string '0' (length=1)
      'useCount' => string '0' (length=1)
      'userMarkCount' => int 0
  4 => 
    array (size=6)
      'title' => string 'cocoyo' (length=6)
      'recommend' => string '0' (length=1)
      'tagCount' => string '0' (length=1)
      'useCount' => string '0' (length=1)
      'userMarkCount' => int 0

我们上面定义一个二位数组,然后指定useCount进行排序:

$arrSort = [];
$condition = ['field' => 'useCount', 'direction' => 'SORT_DESC']; //SORT_DESC 倒序  SORT_ASC正序

  foreach ($array as $key => $value) {
          foreach ($value as $k => $v) {
              $arrSort[$k][$key] = $v;
           }
     }
    array_multisort($arrSort[$condition['field']], $condition['direction'], $array);

我们再来看下排序结果:

array (size=5)
  0 => 
    array (size=6)
      'title' => string '黄段子' (length=9)
      'recommend' => string '0' (length=1)
      'tagCount' => string '3' (length=1)
      'useCount' => string '19' (length=2)
      'userMarkCount' => int 13
  1 => 
    array (size=6)
      'title' => string '搞笑' (length=6)
      'recommend' => string '0' (length=1)
      'tagCount' => string '0' (length=1)
      'useCount' => string '0' (length=1)
      'userMarkCount' => int 0
  2 => 
    array (size=6)
      'title' => string '心理专家' (length=12)
      'recommend' => string '1' (length=1)
      'tagCount' => string '0' (length=1)
      'useCount' => string '0' (length=1)
      'userMarkCount' => int 0
  3 => 
    array (size=6)
      'title' => string ' 不一样的搞笑' (length=19)
      'recommend' => string '1' (length=1)
      'tagCount' => string '0' (length=1)
      'useCount' => string '0' (length=1)
      'userMarkCount' => int 0
  4 => 
    array (size=6)
      'title' => string 'cocoyo' (length=6)
      'recommend' => string '0' (length=1)
      'tagCount' => string '0' (length=1)
      'useCount' => string '0' (length=1)
      'userMarkCount' => int 0

至此,排序就成功了,不过套用了两层foreach,相信一定还有更优的排序方法,有更优的排序方案的小伙伴欢迎留言:grin:。

如此.
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 6
leung0826

laravel 中有个帮助函数可以实现:http://learnku.com/docs/laravel/5.3/collec...

7年前 评论

@leung0826 感谢!不过我用的是tp框架,一直想投入laravel的怀抱:joy:

7年前 评论

@coodeer 感谢提示!unsort确实可以:+1:

 usort($array, function ($a, $b) {
            if ($a['useCount'] == $b['useCount']) return 0;
            return ($a['useCount'] < $b['useCount']) ? -1 : 1;
        });
7年前 评论
usort($array, function ($a, $b) {
        return $a['useCount'] <=> $b['useCount'];
});
7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!