array multisort對多維陣列進行排序

2021-08-26 09:56:40 字數 3857 閱讀 4997

一、先看最簡單的情況。有兩個陣列:

$arr1 = array(1,9,5);

$arr2 = array(6,2,4);

array_multisort($arr1,$arr2);

print_r($arr1); // 得到的順序是1,5,9

print_r($arr2); // 得到的順序是6,4,2  

兩個陣列的值自始至終都是對應著的:1對應6,9對應2,5對應4。

檢視結果,1自始至終都對應6對應3,其它項也是如此。這種對應關係就是手冊中所謂的「排序時保留原有的鍵名關聯」。

另外也可以把每個陣列想像成資料庫表的一列。而對應著的1,6,3為一資料行,9,2,7為另一資料行。。。

array_multisort會先按第乙個陣列(想像成列)排序,如果第乙個陣列(列)的值相同,則按第二個陣列(列)排序。

具體可以用下面的程式來測試:

$arr1 = array(1,9,5,9);

$arr2 = array(6,2,4,1);

$arr3 = array(3,7,8,0);

array_multisort($arr1,$arr2,$arr3); 

可以想像這裡$arr3的結果是(3,8,0,7)。

二、接下來講解array_multisort的引數。這個函式的引數很靈活。最簡單的情況是如上面所示的以1個或n個陣列作為引數,需要注意的是每個陣列的項數要一樣,否則會warning導致排序失效。

像這樣array_multisort($arr1,$arr2,$arr3); 預設是所有陣列都是公升序排列,如果想對$arr2降序,並當作字串去比較,就要寫成:

array_multisort($arr1, $arr2, sort_desc, sort_string, $arr3);

每個array後面可以跟乙個排序順序標誌或乙個排序型別標誌,或者兩種標誌同時出現。但是每種排序標誌在每個陣列後面只能出現乙個。

詳細如下:

排序順序標誌:

sort_asc - 按照上公升順序排序(預設)

sort_desc - 按照下降順序排序

排序型別標誌:

sort_regular - 將專案按照通常方法比較(預設)

sort_numeric - 將專案按照數值比較

sort_string - 將專案按照字串比較

三、最後是array_multisort有什麼實際作用。

我們通常有一些多維陣列需要排序:

$guys = array

( [0] => array

([name] => jake

[score] => 80

[grade] => a

)[1] => array

([name] => jin

[score] => 70

[grade] => a

)[2] => array

([name] => john

[score] => 80

[grade] => a

)[3] => array

([name] => ben

[score] => 20

[grade] => b

))例如我們想按成績倒序排列,如果成績相同就按名字的公升序排列。

這時我們就需要根據$guys的順序多弄兩個陣列出來:

$scores = array(80,70,80,20);

$names = array('jake','jin','john','ben');

然後array_multisort($scores, sort_desc, $names, $guys);就行了

還能不能更靈活一點呢,每次想排序都要另外弄些陣列出來嗎?

其實在qeephp的helper_array類裡面已經封裝得很好,下面是它的兩個方法,需要的人自己修改一下就可以用了:

/*** 根據指定的鍵對陣列排序

** 用法:

* @code php

* $rows = array(

* array('id' => 1, 'value' => '1-1', 'parent' => 1),

* array('id' => 2, 'value' => '2-1', 'parent' => 1),

* array('id' => 3, 'value' => '3-1', 'parent' => 1),

* array('id' => 4, 'value' => '4-1', 'parent' => 2),

* array('id' => 5, 'value' => '5-1', 'parent' => 2),

* array('id' => 6, 'value' => '6-1', 'parent' => 3),

* );

** $rows = helper_array::sortbycol($rows, 'id', sort_desc);

* dump($rows);

* // 輸出結果為:

* // array(

* // array('id' => 6, 'value' => '6-1', 'parent' => 3),

* // array('id' => 5, 'value' => '5-1', 'parent' => 2),

* // array('id' => 4, 'value' => '4-1', 'parent' => 2),

* // array('id' => 3, 'value' => '3-1', 'parent' => 1),

* // array('id' => 2, 'value' => '2-1', 'parent' => 1),

* // array('id' => 1, 'value' => '1-1', 'parent' => 1),

* // )

* @endcode

** @param array $array 要排序的陣列

* @param string $keyname 排序的鍵

* @param int $dir 排序方向

** @return array 排序後的陣列

*/static function sortbycol($array, $keyname, $dir = sort_asc)

/*** 將乙個二維陣列按照多個列進行排序,類似 sql 語句中的 order by

** 用法:

* @code php

* $rows = helper_array::sortbymulticols($rows, array(

* 'parent' => sort_asc,

* 'name' => sort_desc,

* ));

* @endcode

** @param array $rowset 要排序的陣列

* @param array $args 排序的鍵

** @return array 排序後的陣列

*/static function sortbymulticols($rowset, $args)

$sortrule .= '$sortarray[\'' . $sortfield . '\'], ' . $sortdir . ', ';

}if (empty($sortarray) || empty($sortrule))

eval('array_multisort(' . $sortrule . '$rowset);');

return $rowset;

}

array multisort 排序說明

第乙個引數是陣列,隨後的每乙個引數可能是陣列,也可能是下面的排序順序標誌 排序標誌用於更改預設的排列順序 之一 sort asc 預設,按公升序排列。a z sort desc 按降序排列。z a 隨後可以指定排序的型別 sort regular 預設。將每一項按常規順序排列。sort numeri...

陣列排序array multisort

array multisort 對多個陣列或者多維陣列進行排序 參考 secure.php.net 說明 bool array multisort array array1 mixed array1 sort order sort asc mixed array1 sort flags sort r...

array multisort 排序理解

關鍵字 array multisort php array sort 本例中 data 陣列中的每個單元表示乙個表中的一行。這是典型的資料庫記錄的資料集合。例子中的資料如下 volume edition 67 2 86 4 86 3 資料全都存放在名為 data 的陣列中。這通常是通過迴圈從資料庫取...