关于PHP中对数组的排序

本文来详细讲述下PHP中对于数组排序的方法,首先来讲述下PHP中的内置函数对数组进行的排序,这些内置函数有一些共性如下:

1. 数组被作为排序函数的参数,排序以后,数组本身就发生了改变,函数的返回值为bool类型。
2. 函数名中出现单a表示association,含义为,在按值排序的过程中,保持key=>value的对应关系不变
3. 函数名中出现单k表示key,含义为,在按值排序的过程中按照数组key而不是数组的值排序
4. 函数名中出现单r的表示reverse,含义为,按照跟不加r的相反的顺序排列
5. 函数名中出现单u的表示user-defined,含义为,使用用户自定义函数排序,如果函数的逻辑是参数1<参数2返回负数,则按照升序排列(p1小2返负升)。


sort函数

sort() 函数按升序对给定数组的值排序。

注:本函数为数组中的单元赋予新的键名。原有的键名将被删除。

<?php
$test = array("c" => "class", "b" => "bit", "d" => "direct","a" => "app");
sort($test);
print_r($test);
?>

输出:

Array ( [0] => app [1] => bit [2] => class [3] => direct ) 

rsort函数

rsort() 函数对数组的元素按照键值进行逆向排序。与sort的用法基本相同。

<?php
$test = array("c" => "class", "b" => "bit", "d" => "direct","a" => "app");
rsort($test);
print_r($test);
?>
输出:

Array ( [0] => direct [1] => class [2] => bit [3] => app ) 

asort函数

asort() 函数对数组进行排序并保持索引关系。

<?php
$test = array("c" => "class", "b" => "bit", "d" => "direct","a" => "app");
asort($test);
print_r($test);
?>
输出:

Array ( [a] => app [b] => bit [c] => class [d] => direct ) 

arsort函数

arsort() 函数对数组进行逆向排序并保持索引关系。与asort的用法基本相同。

<?php
$test = array("c" => "class", "b" => "bit", "d" => "direct","a" => "app");
arsort($test);
print_r($test);
?>
输出:

ray ( [d] => direct [c] => class [b] => bit [a] => app ) 

ksort函数

ksort() 函数按照键名对数组排序,为数组值保留原来的键。

<?php
$test = array("c" => "class", "b" => "bit", "d" => "direct","a" => "app");
ksort($test);
print_r($test);
?>
输出:

Array ( [a] => app [b] => bit [c] => class [d] => direct ) 

krsort函数

krsort() 函数将数组按照键逆向排序,为数组值保留原来的键。与ksort的用法基本相同。

<?php
$test = array("c" => "class", "b" => "bit", "d" => "direct","a" => "app");
krsort($test);
print_r($test);
?>
输出:

Array ( [d] => direct [c] => class [b] => bit [a] => app ) 

usort函数

usort() 函数使用用户自定义的函数对数组排序。

用户自定义的函数必须设计为返回 -1, 0, 或 1,并应该接受两个供比较的参数。

<?php
function my_sort($a, $b)
{
  if ($a == $b) return 0;
  return ($a > $b) ? 1 : -1;
}
$test = array("c" => "class", "b" => "bit", "d" => "direct","a" => "app");
usort($test, 'my_sort');
print_r($test);
?>
输出:

Array ( [0] => app [1] => bit [2] => class [3] => direct ) 

uksort函数

uksort() 函数使用用户自定义的比较函数按照键名对数组排序,并保持索引关系。

<?php
function my_sort($a, $b)
{
  if ($a == $b) return 0;
  return ($a > $b) ? 1 : -1;
}
$test = array("c" => "class", "b" => "bit", "d" => "direct","a" => "app");
uksort($test, 'my_sort');
print_r($test);
?>
输出:

Array ( [a] => app [b] => bit [c] => class [d] => direct ) 

uasort函数

uasort() 函数使用用户自定义的比较函数对数组排序,并保持索引关联(不为元素分配新的键)。

<?php
function my_sort($a, $b)
{
  if ($a == $b) return 0;
  return ($a > $b) ? 1 : -1;
}
$test = array("c" => "class", "b" => "bit", "d" => "direct","a" => "app");
uasort($test, 'my_sort');
print_r($test);
?>
输出:

Array ( [a] => app [b] => bit [c] => class [d] => direct ) 

array_multisort函数

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

<?php
$test1 = array("c" => "class", "b" => "bit", "d" => "direct","a" => "app");
$test2 = array("r" => "class", "c" => "bit", "b" => "direct","v" => "app");
array_multisort($test1, $test2);
print_r($test1);
echo '<br />';
print_r($test2);
?>
输出:

Array ( [a] => app [b] => bit [c] => class [d] => direct )
Array ( [v] => app [c] => bit [r] => class [b] => direct ) 

我们要注意的是对多个数据排序的时候,首先按第一个数组进行排序,第一个数组值相同的时候,才按第二个数组排序。数组的值总是对应的,具体看下面几个例子。

<?php
$test1 = array("c" => "class", "b" => "bit", "d" => "direct","a" => "app");
$test2 = array("c" => "bit", "r" => "class", "b" => "direct","v" => "app");
array_multisort($test1, SORT_ASC, $test2, SORT_DESC);
print_r($test1);
echo '<br />';
print_r($test2);
?>
输出:

Array ( [a] => app [b] => bit [c] => class [d] => direct )
Array ( [v] => app [r] => class [c] => bit [b] => direct ) 
我们发现第二个数组的排序有点问题,没有按我们想要的进行,那是因为数组的对应关系。

<?php
$test1 = array("c" => "class", "b" => "class", "d" => "direct","a" => "app");
$test2 = array("c" => "bit", "r" => "class", "b" => "direct","v" => "app");
array_multisort($test1, SORT_ASC, $test2, SORT_DESC);
print_r($test1);
echo '<br />';
print_r($test2);
?>
输出:

Array ( [a] => app [b] => class [c] => class [d] => direct )
Array ( [v] => app [r] => class [c] => bit [b] => direct ) 
由于第一个数组有相同的2个值的元素,所以这2个元素按照第2个数组的规则来排序,2个数组的对应关系始终才成立。

对多维数组排序的例子如下

<?php
echo '<pre>';
$test = array(array("c" => 100, "b" => 52, "d" => 77,"a" => 105), array("c" => 32, "r" => 5, "b" => 49,"v" => 99));
print_r($test);
array_multisort($test[0],$test[1]);
print_r($test);
?>
输出:

Array
(
    [0] => Array
        (
            [c] => 100
            [b] => 52
            [d] => 77
            [a] => 105
        )

    [1] => Array
        (
            [c] => 32
            [r] => 5
            [b] => 49
            [v] => 99
        )

)
Array
(
    [0] => Array
        (
            [b] => 52
            [d] => 77
            [c] => 100
            [a] => 105
        )

    [1] => Array
        (
            [r] => 5
            [b] => 49
            [c] => 32
            [v] => 99
        )

)

二维数组排序

function array_sort($arr,$keys,$type='asc'){
    $keysvalue = $new_array = array();
    foreach ($arr as $k=>$v){
        $keysvalue[$k] = $v[$keys];
    }
    if($type == 'asc'){
        asort($keysvalue);
    }else{
        arsort($keysvalue);
    }
    reset($keysvalue);
    foreach ($keysvalue as $k=>$v){
        $new_array[$k] = $arr[$k];
    }
    return $new_array;
} 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章