ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

PHP多维数组按照某个字段进行排序

2022-08-24 13:33:48  阅读:308  来源: 互联网

标签:排序 age event 多维 array PHP type id


作为开发人员,您可能会遇到这种情况,即数据库中有一个按特定顺序获取的数据列表,但您希望在前端显示这些项目时安装期中某一个字段进行排序。

比如数组:

$mylist = array(
array('ID' => 1, 'title' => 'Boring Meeting', 'event_type' => 'meeting'),
array('ID' => 2, 'title' => 'Find My Stapler', 'event_type' => 'meeting'),
array('ID' => 3, 'title' => 'Mario Party', 'event_type' => 'party'),
array('ID' => 4, 'title' => 'Duct Tape Party', 'event_type' => 'party')
);

你希望得到以下结果:

$mylist = array(
array('ID' => 4, 'title' => 'Duct Tape Party', 'event_type' => 'party'),
array('ID' => 3, 'title' => 'Mario Party', 'event_type' => 'party'),
array('ID' => 2, 'title' => 'Find My Stapler', 'event_type' => 'meeting'),
array('ID' => 1, 'title' => 'Boring Meeting', 'event_type' => 'meeting')
);

我们可以使用两种不同的方法来做到这一需求。

  1. PHP usort()函数
  2. PHP array_mulitsort()函数

 

PHP usort()实现多维数组按某一键值排序

如果您仍使用PHP 5.2或更早版本,则必须先定义一个排序函数

function sortByOrder($a, $b) {
    return $a['id'] - $b['id'];
}

usort($myArray, 'sortByOrder');

从PHP 5.3开始,您可以使用匿名函数:

usort($myArray, function($a, $b) {
    return $a['id'] - $b['id'];
});

在PHP 7中,您可以使用spaceship运算符:

usort($myArray, function($a, $b) {
    return $a['id'] <=> $b['id'];
});

如果要基于多个键值对数组进行排序,则必须在回调函数中编写一些复杂的逻辑。如:

usort($myArray, function($a, $b) {
    $retval = $a['id'] <=> $b['id'];
    if ($retval == 0) {
        $retval = $a['suborder'] <=> $b['suborder'];
        if ($retval == 0) {
            $retval = $a['details']['subsuborder'] <=> $b['details']['subsuborder'];
        }
    }
    return $retval;
});

 

PHP array_mulitsort()实现多维数组排序

PHP array_multisort() 对多个数组或多维数组进行排序 

语法:

bool array_multisort ( array ar1 [, mixed arg [, mixed ... [, array ...]]] )

 如果成功则返回 TRUE,失败则返回 FALSE。 

array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。 

关联(string)键名保持不变,但数字键名会被重新索引。 

输入数组被当成一个表的列并以行来排序――这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。 

本函数的参数结构有些不同寻常,但是非常灵活。第一个参数必须是一个数组。接下来的每个参数可以是数组或者是下面列出的排序标志。 

排序顺序标志: 

  • SORT_ASC – 按照上升顺序排序 
  • SORT_DESC – 按照下降顺序排序 

 

排序类型标志: 

  • SORT_REGULAR – 将项目按照通常方法比较 
  • SORT_NUMERIC – 将项目按照数值比较 
  • SORT_STRING – 将项目按照字符串比较 

每个数组之后不能指定两个同类的排序标志。每个数组后指定的排序标志仅对该数组有效 – 在此之前为默认值 SORT_ASC 和 SORT_REGULAR。 

示例:

$mylist = array(
array('ID' => 1, 'title' => 'Boring Meeting', 'event_type' => 'meeting'),
array('ID' => 2, 'title' => 'Find My Stapler', 'event_type' => 'meeting'),
array('ID' => 3, 'title' => 'Mario Party', 'event_type' => 'party'),
array('ID' => 4, 'title' => 'Duct Tape Party', 'event_type' => 'party')
);
$keys = array_column($mylist, 'id');
array_multisort($keys, SORT_ASC, $mylist);
var_dump($mylist);

结果:

array (
  0 => 
  array (
    'ID' => 4,
    'title' => 'Duct Tape Party',
    'event_type' => 'party',
  ),
  1 => 
  array (
    'ID' => 3,
    'title' => 'Mario Party',
    'event_type' => 'party',
  ),
  2 => 
  array (
    'ID' => 1,
    'title' => 'Boring Meeting',
    'event_type' => 'meeting',
  ),
  3 => 
  array (
    'ID' => 2,
    'title' => 'Find My Stapler',
    'event_type' => 'meeting',
  ),
)

 

array_multisort()按2个键的值排序

$arr = array(
  '0' => array(
    'id' => 3,
    'age' => 27
  ),
  '1' => array(
    'id' => 5,
    'age' => 50
  ),
  '2' => array(
    'id' => 4,
    'age' => 44
  ),
  '3' => array(
    'id' => 3,
    'age' => 78
  ) 
);
foreach ( $arr as $key => $row ){
  $id[$key] = $row ['id'];
  $age[$key] = $row ['age'];
}
array_multisort($id, SORT_ASC, $age, SORT_DESC, $arr);
print_r($arr);

结果:

Array
(
    [0] => Array
        (
            [id] => 3
            [age] => 78
        )

    [1] => Array
        (
            [id] => 3
            [age] => 27
        )

    [2] => Array
        (
            [id] => 4
            [age] => 44
        )

    [3] => Array
        (
            [id] => 5
            [age] => 50
        )
)

 

array_multisort()按3个键的值排序

$array1 = array(
      0=>array('id'=>8,'name'=>'Apple','age'=> 18),
      1=>array('id'=>8,'name'=>'Bed','age'=>17),
      2=>array('id'=>5,'name'=>'Cos','age'=>16),
      3=>array('id'=>5,'name'=>'Cos','age'=>14)
);
function sortArrByManyField(){
  $args = func_get_args();
  if(empty($args)){
    return null;
  }
  $arr = array_shift($args);
  if(!is_array($arr)){
    throw new Exception("The first argument is not an array");
  }
  foreach($args as $key => $field){
    if(is_string($field)){
      $temp = array();
      foreach($arr as $index=> $val){
        $temp[$index] = $val[$field];
      }
      $args[$key] = $temp;
    }
  }
  $args[] = &$arr;
  call_user_func_array('array_multisort',$args);
  return array_pop($args);
}
$arr = sortArrByManyField($array1,'id',SORT_ASC,'name',SORT_ASC,'age',SORT_DESC);
print_r($arr);

结果:

Array
(
    [0] => Array
        (
            [id] => 5
            [name] => Cos
            [age] => 16
        )

    [1] => Array
        (
            [id] => 5
            [name] => Cos
            [age] => 14
        )

    [2] => Array
        (
            [id] => 8
            [name] => Apple
            [age] => 18
        )

    [3] => Array
        (
            [id] => 8
            [name] => Bed
            [age] => 17
        )
)

以上就是本文的全部内容,希望对大家的学习有所帮助。更多教程请访问码农之家

标签:排序,age,event,多维,array,PHP,type,id
来源: https://www.cnblogs.com/myhomepages/p/16619539.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有