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:。

如此.
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6
leung0826

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

6年前 评论

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

6年前 评论

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

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

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