關於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;
} 


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