二维数组排序

Posted 倾城一笑stu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维数组排序相关的知识,希望对你有一定的参考价值。

问题引入: 例如现在要对下面的二维数组按照姓名(name)的字典顺序升序排列:

$person = array(
  array('num'=>'001','id'=>6,'name'=>'zhangsan','age'=>21),
  array('num'=>'001','id'=>7,'name'=>'ahangsan','age'=>23),
  array('num'=>'003','id'=>1,'name'=>'bhangsan','age'=>23),
  array('num'=>'001','id'=>3,'name'=>'dhangsan','age'=>23),
);

 方法1:我们可以使用usort()函数,即用户自定义比较函数来对数组中的值进行排序

/**
 * 按照字典顺序对姓名进行排序,返回值为负数或者false时表示第一个参数应该在前
 * @param  [mixed] $x
 * @param  [mixed] $y
 * @return [type]    [description]
 */
function sort_by_name($x,$y)
  return strcasecmp($x['name'],$y['name']);


//usort($person,'sort_by_name');    //设置usort的第二个参数为上面排序的函数名

//或者直接使用下面匿名函数,即设置usort的第二个参数为一个匿名函数
usort($person, function($x, $y) 
     return strcasecmp($x['name'],$y['name']);
);

var_dump($person);

打印如果如下:

array (size=4)
  0 => 
    array (size=4)
      'num' => string '001' (length=3)
      'id' => int 7
      'name' => string 'ahangsan' (length=8)
      'age' => int 23
  1 => 
    array (size=4)
      'num' => string '003' (length=3)
      'id' => int 1
      'name' => string 'bhangsan' (length=8)
      'age' => int 23
  2 => 
    array (size=4)
      'num' => string '001' (length=3)
      'id' => int 3
      'name' => string 'dhangsan' (length=8)
      'age' => int 23
  3 => 
    array (size=4)
      'num' => string '001' (length=3)
      'id' => int 6
      'name' => string 'zhangsan' (length=8)
      'age' => int 21

方法2:使用array_multisort()排序

假设二维数组结构如下:

$users = array(
  array('name' => 'tom', 'age' => 20), 
  array('name' => 'anny', 'age' => 18),
  array('name' => 'jack', 'age' => 22)
);

现在要按照age升序排列,则需要先将age提取出来存储到一维数组里,再用array_multisort()进行排序

//将age提取出来存储到一维数组里
$ages = array();
foreach ($users as $user) 
  $ages[] = $user['age'];

//按照age升序排列
array_multisort($ages, SORT_ASC, $users); 
var_dump($users);

打印结果如下:

array (size=3)
  0 => 
    array (size=2)
      'name' => string 'anny' (length=4)
      'age' => int 18
  1 => 
    array (size=2)
      'name' => string 'tom' (length=3)
      'age' => int 20
  2 => 
    array (size=2)
      'name' => string 'jack' (length=4)
      'age' => int 22

如果要先按age升序排列,再按照name升序排列,则多提取一个name数组出来:

//将age提取出来存储到一维数组里
$ages = array();
foreach ($users as $user) 
  $ages[] = $user['age'];

//将name提取出来存储到一维数组里
$names = array();
foreach ($users as $names) 
  $names[] = $user['name'];

//先按年龄升序排列,再按照名称升序排列
array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users);
var_dump($users);

打印结果如下:

array (size=3)
  0 => 
    array (size=2)
      'name' => string 'anny' (length=4)
      'age' => int 18
  1 => 
    array (size=2)
      'name' => string 'tom' (length=3)
      'age' => int 20
  2 => 
    array (size=2)
      'name' => string 'jack' (length=4)
      'age' => int 22

附完整代码

方法1:

<?php
/*二维数组排序*/

//1.使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
$person = array(
  array('num'=>'001','id'=>6,'name'=>'zhangsan','age'=>21),
  array('num'=>'001','id'=>7,'name'=>'ahangsan','age'=>23),
  array('num'=>'003','id'=>1,'name'=>'bhangsan','age'=>23),
  array('num'=>'001','id'=>3,'name'=>'dhangsan','age'=>23),
);

/**
 * 按照字典顺序对姓名进行排序,返回值为负数或者false时表示第一个参数应该在前
 * @param  [mixed] $x
 * @param  [mixed] $y
 * @return [type]    [description]
 */
function sort_by_name($x,$y)
  return strcasecmp($x['name'],$y['name']);


//uasort($person,'sort_by_name');    //用usort也行

//用匿名函数
usort($person, function($x, $y) 
     return strcasecmp($x['name'],$y['name']);
);

var_dump($person);

/*
array (size=4)
  0 => 
    array (size=4)
      'num' => string '001' (length=3)
      'id' => int 7
      'name' => string 'ahangsan' (length=8)
      'age' => int 23
  1 => 
    array (size=4)
      'num' => string '003' (length=3)
      'id' => int 1
      'name' => string 'bhangsan' (length=8)
      'age' => int 23
  2 => 
    array (size=4)
      'num' => string '001' (length=3)
      'id' => int 3
      'name' => string 'dhangsan' (length=8)
      'age' => int 23
  3 => 
    array (size=4)
      'num' => string '001' (length=3)
      'id' => int 6
      'name' => string 'zhangsan' (length=8)
      'age' => int 21
*/

方法2:

<?php
/*二维数组排序*/

// 2.使用array_multisort排序
$users = array(
  array('name' => 'tom', 'age' => 20), 
  array('name' => 'anny', 'age' => 18),
  array('name' => 'jack', 'age' => 22)
);
//将age提取出来存储到一维数组里
$ages = array();
foreach ($users as $user) 
  $ages[] = $user['age'];

//将name提取出来存储到一维数组里
$names = array();
foreach ($users as $names) 
  $names[] = $user['name'];


//按照age升序排列
array_multisort($ages, SORT_ASC, $users); 
var_dump($users);
/*
array (size=3)
  0 => 
    array (size=2)
      'name' => string 'anny' (length=4)
      'age' => int 18
  1 => 
    array (size=2)
      'name' => string 'tom' (length=3)
      'age' => int 20
  2 => 
    array (size=2)
      'name' => string 'jack' (length=4)
      'age' => int 22
 */


//先按年龄升序排列,再按照名称升序排列
array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users);
var_dump($users);
/*
array (size=3)
  0 => 
    array (size=2)
      'name' => string 'anny' (length=4)
      'age' => int 18
  1 => 
    array (size=2)
      'name' => string 'tom' (length=3)
      'age' => int 20
  2 => 
    array (size=2)
      'name' => string 'jack' (length=4)
      'age' => int 22
 */

这里顺便说一下PHP排序的几个函数

sort  对数组排序 一般适用于一维索引数组,不会保持索引

rsort  对数组逆向排序 和sort用法一致

asort  对数组进行排序并保持索引关系对值进行排序,一般适用于一维数组,保持索引关系

arsort  对数组进行逆向排序并保持索引关系和asort用法一致

ksort  对数组按照键名排序

krsort  对数组按照键名逆向排序


my github:https://github.com/lensh



以上是关于二维数组排序的主要内容,如果未能解决你的问题,请参考以下文章

c程序输入10个数到一维数组中,按升序排序后输出。

sort int[][] 二维数组排序

Vector容器 二维数组sort()排序

二维数组排序

thinkPHP二维数组排序

java二维数组 按某列排序