本文來詳細講述下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;
}