array_multisort二维或多维数组或多个数组的排序实例详解

阅读771评论1

项目中使用到多维数组的排序,去官网看了下介绍。

php的array_multisort() 函数对多个数组或多维数组进行排序,字符串键名(key)将被保留,但是数字键名将被重新索引,从 0 开始,并以 1 递增。

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


官方的介绍可能有点模糊,我们用实例来了解下这个函数。

1、字符串索引和数字索引

$a=array('b','a','c');
$b=array('a'=>1,'b'=>3,'c'=>2);
array_multisort($a);

/*
$a=Array ( [0] => a [1] => b [2] => c )
$b=Array ( [a] => 1 [c] => 2 [b] => 3 )
*/

可以看到,两个数组都是按照升序排序的


2、两个数组排序

$a=array('b','a','c');
$b=array('a'=>1,'b'=>3,'c'=>2);
array_multisort($a,$b);

/*
$a=Array ( [0] => a [1] => b [2] => c )
$b=Array ( [b] => 3 [a] => 1 [c] => 2 )
*/

$a数组时升序排序(默认),$b数组就是按照a数组的key顺序排序。上面这个例子中,a数组排序后的key顺序是1,0,2,b数组也会按照这个顺序重新排序数组。


3、同值排序

$a=array('a'=>1,'b'=>3,'c'=>3);
$b=array('a'=>2,'b'=>3,'c'=>1);
array_multisort($a,$b);

/*
$a=Array ( [a] => 1 [c] => 3 [b] => 3 )
$b=Array ( [a] => 2 [c] => 1 [b] => 3 )
*/

这个例子中,a数组升序排序,但是b和c的值是一样的,至于谁排到前面,看数组b,b数组中的c小于b,所以c排到前面。b数组SORT_DESC排序也是同理。


4、多维数组排序

$a=array(
	array('a'=>'a','b'=>3),
	array('a'=>'c','b'=>2),
	array('a'=>'b','b'=>1),
);
$k1=array_column($a,'a');//Array ( [0] => a [1] => c [2] => b )

array_multisort($k1,SORT_DESC,$a);
/*
Array ( 
	[0] => Array ( [a] => c [b] => 2 )
	[1] => Array ( [a] => b [b] => 1 )
	[2] => Array ( [a] => a [b] => 3 )
)
*/

这个例子中,我们将a数组按照a字段降序排序,可以先提取a字段,然后让k1数组降序排序,a数组会按照新的排序顺序重新排序。这样就达到了a数组指定字段排序了。其他字段排序同理。

PS:多维数组默认会以第一个键值进行排序,所以此例子中本可以不用提取a字段的,为了更方便理解就提取了一下。


5、多维数组多字段排序

$a=array(
	array('a'=>'a','b'=>3,'c'=>12),
	array('a'=>'c','b'=>2,'c'=>24),
	array('a'=>'b','b'=>2,'c'=>8),
);
$k2=array_column($a,'b');//Array ( [0] => 3 [1] => 2 [2] => 2 )
$k3=array_column($a,'c');//Array ( [0] => 12 [1] => 24 [2] => 8 )

array_multisort($k2,SORT_DESC,$k3,$a);
/*
Array ( 
	[0] => Array ( [a] => a [b] => 3 [c] => 12 )
	[1] => Array ( [a] => b [b] => 2 [c] => 8 )
	[2] => Array ( [a] => c [b] => 2 [c] => 24 )
)
*/

此例子中,a数组先以b字段降序排序,再以c字段升序排序。和上面的例4一样,先提取b和c字段,先k2降序(SORT_DESC),在k3升序。