2024 PHP Conference Japan

sort

(PHP 4, PHP 5, PHP 7, PHP 8)

sort將陣列依遞增順序排序

說明

sort(陣列 &$array, 整數 $flags = SORT_REGULAR): true

以遞增順序,依值排序 array

注意事項:

如果兩個成員比較結果相等,它們會保留原始順序。在 PHP 8.0.0 之前,它們在排序後陣列中的相對順序未定義。

注意此函式會將新的鍵值指派給 array 中的元素。它會移除任何可能已指派的現有鍵值,而不是僅重新排序鍵值。

注意事項:

將陣列的內部指標重置為第一個元素。

參數

array

輸入的陣列。

flags

可選的第二個參數 flags 可用於修改排序行為,使用以下值:

排序類型旗標

回傳值

總是回傳 true

更新日誌

版本 說明
8.2.0 回傳類型現在是 true;之前是 bool

範例

範例 #1 sort() 範例

<?php

$fruits
= array("lemon", "orange", "banana", "apple");
sort($fruits);
foreach (
$fruits as $key => $val) {
echo
"fruits[" . $key . "] = " . $val . "\n";
}

?>

上述範例將輸出:

fruits[0] = apple
fruits[1] = banana
fruits[2] = lemon
fruits[3] = orange

水果已按字母順序排序。

範例 #2 sort() 範例,使用不區分大小寫的自然排序

<?php

$fruits
= array(
"Orange1", "orange2", "Orange3", "orange20"
);
sort($fruits, SORT_NATURAL | SORT_FLAG_CASE);
foreach (
$fruits as $key => $val) {
echo
"fruits[" . $key . "] = " . $val . "\n";
}

?>

上述範例將輸出:

fruits[0] = Orange1
fruits[1] = orange2
fruits[2] = Orange3
fruits[3] = orange20

這些水果已像 natcasesort() 一樣排序好了。

注意事項

注意如同大多數的 PHP 排序函式,sort() 使用了 » 快速排序法 (Quicksort) 的一種實作。樞紐(pivot)會選擇在分區的中央,使得已排序的陣列能達到最佳時間。然而,這是一個您不應該依賴的實作細節。

警告

排序包含混合類型值的陣列時要小心,因為如果 flagsSORT_REGULAR 的話,sort() 可能會產生非預期的結果。

參見

新增筆記

使用者貢獻的筆記 35 則筆記

phpdotnet at m4tt dot co dot uk
14 年前
用特定鍵值排序陣列的簡單函式。會維持索引關聯。

<?php

function array_sort($array, $on, $order=SORT_ASC)
{
$new_array = array();
$sortable_array = array();

if (
count($array) > 0) {
foreach (
$array as $k => $v) {
if (
is_array($v)) {
foreach (
$v as $k2 => $v2) {
if (
$k2 == $on) {
$sortable_array[$k] = $v2;
}
}
} else {
$sortable_array[$k] = $v;
}
}

switch (
$order) {
case
SORT_ASC:
asort($sortable_array);
break;
case
SORT_DESC:
arsort($sortable_array);
break;
}

foreach (
$sortable_array as $k => $v) {
$new_array[$k] = $array[$k];
}
}

return
$new_array;
}

$people = array(
12345 => array(
'id' => 12345,
'first_name' => 'Joe',
'surname' => 'Bloggs',
'age' => 23,
'sex' => 'm'
),
12346 => array(
'id' => 12346,
'first_name' => 'Adam',
'surname' => 'Smith',
'age' => 18,
'sex' => 'm'
),
12347 => array(
'id' => 12347,
'first_name' => 'Amy',
'surname' => 'Jones',
'age' => 21,
'sex' => 'f'
)
);

print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first
print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname

/*
Array
(
[12345] => Array
(
[id] => 12345
[first_name] => Joe
[surname] => Bloggs
[age] => 23
[sex] => m
)

[12347] => Array
(
[id] => 12347
[first_name] => Amy
[surname] => Jones
[age] => 21
[sex] => f
)

[12346] => Array
(
[id] => 12346
[first_name] => Adam
[surname] => Smith
[age] => 18
[sex] => m
)

)
Array
(
[12345] => Array
(
[id] => 12345
[first_name] => Joe
[surname] => Bloggs
[age] => 23
[sex] => m
)

[12347] => Array
(
[id] => 12347
[first_name] => Amy
[surname] => Jones
[age] => 21
[sex] => f
)

[12346] => Array
(
[id] => 12346
[first_name] => Adam
[surname] => Smith
[age] => 18
[sex] => m
)

)
*/

?>
Md. Abutaleb
4 年前
<?php
/*
我發現 sort() 函式通常會根據以下優先順序進行升冪排序:
1. NULL
2. 空字串
3. 布林值 FALSE
4. 字串
5. 浮點數
6. 整數
7. 陣列
8. 物件

考慮以下陣列:
*/

$a = ['fruit'=> 'apple', 'A' => 10, 20, 5, 2.5, 5=>'A new value', 'last' => 'value', TRUE, NULL, "", FALSE, array(), new StdClass];
sort($a);
var_dump($a);

#輸出結果:

array(13) {
[
0]=>NULL
[1]=> string(0) ""
[2]=>bool(false)
[
3]=>string(11) "A new value"
[4]=>string(5) "apple"
[5]=>string(5) "value"
[6]=> float(2.5)
[
7]=> int(5)
[
8]=>int(10)
[
9]=>int(20)
[
10]=>array(0) { }
[
11]=> bool(true)
[
12]=>object(stdClass)#1 (0) {}
}

//希望當您對包含混合類型資料的陣列進行排序時,這能消除您的困惑。
?>
aminkhoshzahmat at gmail dot com
4 年前
假設我們有一個姓名列表,而且它沒有排序。

<?php

$names
= array('Amin', 'amir', 'sarah', 'Somayeh', 'armita', 'Armin');

sort($names); // 簡易字母排序
print_r($names);
?>
結果是
陣列
(
[0] => Amin
[1] => Armin
[2] => Somayeh // 實際上從這裡開始就不是按字母順序排序!
[3] => amir // 比較是基於 ASCII 值。
[4] => armita
[5] => sarah
)

如果您想要不區分大小寫地按字母順序排序

<?php

sort
($names, SORT_STRING | SORT_FLAG_CASE);
print_r($names);
?>

結果是
陣列
(
[0] => Amin
[1] => amir
[2] => Armin
[3] => armita
[4] => sarah
[5] => Somayeh
)
Walter Tross
12 年前
除非您指定第二個參數,否則將使用「一般」比較。我引用比較運算子頁面上的內容
「如果您將數字與字串進行比較,或比較涉及數字字串,則每個字串都會轉換為數字,並以數值方式執行比較。」
這表示「10」 < 「1a」,而「1a」 < 「2」,但「10」 > 「2」。換句話說,一般的 PHP 字串比較不具備遞移性。
這意味著在極少數情況下,sort() 的輸出可能取決於輸入陣列的順序
<?php
函式 echo_sorted($a)
{
echo
"{$a[0]} {$a[1]} {$a[2]}";
sort($a);
echo
" => {$a[0]} {$a[1]} {$a[2]}\n";
}
// 在 PHP 5.2.6 的版本中:
echo_sorted(array( "10", "1a", "2")); // => 10 1a 2
echo_sorted(array( "10", "2", "1a")); // => 1a 2 10
echo_sorted(array( "1a", "10", "2")); // => 2 10 1a
echo_sorted(array( "1a", "2", "10")); // => 1a 2 10
echo_sorted(array( "2", "10", "1a")); // => 2 10 1a
echo_sorted(array( "2", "1a", "10")); // => 10 1a 2
?>
Abhishek Banerjee
8 年前
編輯:針對 "phpdotnet at m4tt dot co dot uk" 的原始筆記
使用 array_push 取代 $new_array[$k],因為某些原因它會
給我字串索引。

用特定鍵值排序陣列的簡單函式。會維持索引關聯。

<?php

function array_sort($array, $on, $order=SORT_ASC)
{
$new_array = array();
$sortable_array = array();

if (
count($array) > 0) {
foreach (
$array as $k => $v) {
if (
is_array($v)) {
foreach (
$v as $k2 => $v2) {
if (
$k2 == $on) {
$sortable_array[$k] = $v2;
}
}
} else {
$sortable_array[$k] = $v;
}
}

switch (
$order) {
case
SORT_ASC:
asort($sortable_array);
break;
case
SORT_DESC:
arsort($sortable_array);
break;
}

foreach (
$sortable_array as $k => $v) {
array_push($new_array, $array[$k]);
}
}

return
$new_array;
}

$people = array(
12345 => array(
'id' => 12345,
'first_name' => 'Joe',
'surname' => 'Bloggs',
'age' => 23,
'sex' => 'm'
),
12346 => array(
'id' => 12346,
'first_name' => 'Adam',
'surname' => 'Smith',
'age' => 18,
'sex' => 'm'
),
12347 => array(
'id' => 12347,
'first_name' => 'Amy',
'surname' => 'Jones',
'age' => 21,
'sex' => 'f'
)
);

print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first
print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname

/*
Array
(
[12345] => Array
(
[id] => 12345
[first_name] => Joe
[surname] => Bloggs
[age] => 23
[sex] => m
)

[12347] => Array
(
[id] => 12347
[first_name] => Amy
[surname] => Jones
[age] => 21
[sex] => f
)

[12346] => Array
(
[id] => 12346
[first_name] => Adam
[surname] => Smith
[age] => 18
[sex] => m
)

)
Array
(
[12345] => Array
(
[id] => 12345
[first_name] => Joe
[surname] => Bloggs
[age] => 23
[sex] => m
)

[12347] => Array
(
[id] => 12347
[first_name] => Amy
[surname] => Jones
[age] => 21
[sex] => f
)

[12346] => Array
(
[id] => 12346
[first_name] => Adam
[surname] => Smith
[age] => 18
[sex] => m
)

)
*/

?>
eriewave at hotmail dot com
14 年前
如果您需要排序一個包含一些等值元素的陣列,並且希望這些等值元素在排序後能彼此相鄰(類似於 MySQL 的 ORDER BY 輸出),而不是破壞函式,請執行以下操作

<?php

sort
($array, ksort($array))

?>

- 當 sort() 函式找到兩個等值元素時,它會以它們的鍵值 # 作為第二個參數任意排序它們。

-Dirk
danm68 at gmail dot com
15 年前
使用 sort() 處理字串時,排序方式並非單純按字母順序。它會先按字母順序排序所有大寫字串,然後再按字母順序排序所有小寫字串。
只是想讓任何跟我一樣感到困惑的人知道,我從未在任何地方看到過這一點。
ajanata at gmail dot com
13 年前
我花了比預期更長的時間才弄清楚,但如果您想要 sort(\$array, SORT_STRING) 的行為(也就是不像 natcasesort 會重新索引陣列)以不區分大小寫的方式排序,只需使用 usort(\$array, 'strcasecmp') 即可。
joris at mangrove dot nl
17 年前
針對 https://php.dev.org.tw/manual/en/function.sort.php#62311 的說明

排序物件陣列不一定會產生您想要的結果。

如上所述,sort() 會根據第一個成員變數的值排序陣列。但是,您不能總是假設成員變數的順序!您必須考慮您的類別繼承階層!

預設情況下,PHP 會將繼承的成員變數放在最前面,這表示您的第一個成員變數並不是您類別定義中的第一個變數!
但是,如果您使用程式碼分析器或編譯快取,情況可能會大不相同。例如,在 eAccelerator 中,繼承的成員變數位於最後面,這表示開啟或關閉快取會得到不同的排序結果。

結論
永遠不要對值類型不是純量或陣列的陣列使用 sort()。
williamprogphp at[pleaseNOTSPAM] yahoo d
10 年前
為了實現多維快速排序,請利用以下程式碼:

<?php
function quickSortMultiDimensional($array, $chave) {
if(
count( $array ) < 2 ) {
return
$array;
}
$left = $right = array( );
reset( $array );
$pivot_key = key( $array );
$pivot = array_shift( $array );
foreach(
$array as $k => $v ) {
if(
$v[$chave] < $pivot[$chave] )
$left[$k][$chave] = $v[$chave];
else
$right[$k][$chave] = $v[$chave];
}
return
array_merge(
quickSortMultiDimensional($left, $chave),
array(
$pivot_key => $pivot),
quickSortMultiDimensional($right, $chave)
);
}
?>

我是參考 pageconfig dot com 的概念寫的。

感謝您的閱覽。
matpatnik at hotmail dot com
16 年前
這個函式會排序特殊字元字母,例如:&eacute;

希望對大家有幫助

function sort_entity($array) {
$total = count($array);
對於 ($i=0;$i<$total;$i++) {
如果 ($array[$i]{0} == '&') {
$array[$i] = $array[$i]{1}.$array[$i];
} 否則 {
$array[$i] = $array[$i]{0}.$array[$i];
}
}
排序($array);

對於 ($i=0;$i<$total;$i++) {
$array[$i] = substr($array[$i],1);
}

返回 $array;
}
peek at mailandnews dot com
23 年前
我遇到了同樣的不區分大小寫排序問題。實際上我認為應該有一個 SORT_STRING_CASE 標記,但我嘗試了以下方法

usort($listing, 'strcasecmp');

這沒有奏效(為什麼?),但您可以像這樣進行正確的不區分大小寫排序

usort($listing, create_function('$a,$b','return strcasecmp($a,$b);'));
r at rcse dot de
5 年前
這裡沒有任何關於使用任何排序規則對 UTF-8 字串進行排序的說明。這不應該那麼罕見嗎?
stepmuel at ee dot ethz dot ch
15 年前
一種更簡短的方法來排序物件陣列;使用回呼函式。

<?php
函式 objSort(&$objArray,$indexFunction,$sort_flags=0) {
$indices = 陣列();
foreach(
$objArray as $obj) {
$indeces[] = $indexFunction($obj);
}
返回
array_multisort($indeces,$objArray,$sort_flags);
}

函式
getIndex($obj) {
返回
$obj->getPosition();
}

objSort($objArray,'getIndex');
?>
aditycse at gmail dot com
9 年前
/*
* 姓名:Aditya Mehrotra
* 電子郵件:aditycse@gmail.com
*/
//範例:針對同時包含區分大小寫資料的字母數字陣列,依值排序
$exampleArray1 = $exampleArray2 = 陣列(
0 => 'example1',
1 => 'Example10',
2 => 'example12',
3 => 'Example2',
4 => 'example3',
5 => 'EXAMPLE10',
6 => 'example10'
);

//預設排序
asort($exampleArray1);

// 依值排序字母數字及區分大小寫的資料
asort($exampleArray2, SORT_STRING | SORT_FLAG_CASE | SORT_NATURAL);

//預設排序的輸出
print_r($exampleArray1);
/*
* 預設排序的輸出
陣列
(
[5] => EXAMPLE10
[1] => Example10
[3] => Example2
[0] => example1
[6] => example10
[2] => example12
[4] => example3
)
*/

print_r($exampleArray2);
/*
* 依值排序字母數字及區分大小寫資料的輸出
陣列
(
[0] => example1
[3] => Example2
[4] => example3
[5] => EXAMPLE10
[1] => Example10
[6] => example10
[2] => example12
)
*/
me[ at ]szczepan[ dot ]info
11 年前
僅透過排序是不可能在排序鍵值的同時保持值順序的,因為這會產生一個新的陣列。解決方案如下:建立一個新的陣列

<?php
$a
= array(9=>"a",8=>"c",5=>"d");

$keys = array_keys($a);
sort($keys);
$result = array_combine($keys, array_values($a));

//結果:array(5=>"a",8=>"c",9=>"d");
?>
alex dot hristov dot 88 at gmail dot com
13 年前
如同一些人先前所提到的,排序多維陣列可能會有點棘手。我花了不少時間才把它弄好,但它現在運作得非常好。

<?php
//$order 必須是 asc 或 desc
function sortmulti ($array, $index, $order, $natsort=FALSE, $case_sensitive=FALSE) {
if(
is_array($array) && count($array)>0) {
foreach(
array_keys($array) as $key)
$temp[$key]=$array[$key][$index];
if(!
$natsort) {
if (
$order=='asc')
asort($temp);
else
arsort($temp);
}
else
{
if (
$case_sensitive===true)
natsort($temp);
else
natcasesort($temp);
if(
$order!='asc')
$temp=array_reverse($temp,TRUE);
}
foreach(
array_keys($temp) as $key)
if (
is_numeric($key))
$sorted[]=$array[$key];
else
$sorted[$key]=$array[$key];
return
$sorted;
}
return
$sorted;
}
?>
cmarshall at gmx dot de
13 年前
我研究了關於 `sort()` 函式和德語變音符號的各種問題,很快就讓我頭昏腦脹 —— `sort()` 函式是否有 bug?是否該用 locale 解決?等等...(我是個完全的新手)。

對我來說,顯而易見的解決方案是快速且不完美的:將變音符號(在我的例子中以 HTML 編碼呈現)轉換成其一般對應字元('ä' = 'ae','ö' = 'oe','ü' = 'ue','ß' = 'ss' 等等),排序陣列,然後再轉換回來。但有些情況下,'Mueller' 就是 'Mueller',不需要轉換成 'Müller'。因此,例如,我會將變音符號本身替換成其一般對應字元加上一個字串中其他地方沒有使用的字元(例如 '_'),這樣只有在特定組合時才會轉換回變音符號。

當然,除了 '_' 之外,任何其他字元都可以用作附加字元(會影響排序結果)。我知道我的解決方案很粗糙,可能會導致其他排序問題,但它足以滿足我的需求。

此範例中的 `$dat` 陣列填充了德國城鎮名稱(我實際上使用的是多維陣列 (`$dat[][]`),但為了更容易理解,我簡化了程式碼)。

<?php
// START Pre-sorting (Umlaut -> normal letters)
$max = count($dat);
for(
$totcnt = 0; $totcnt < $max; $totcnt++){
$dat[$totcnt]=str_replace('&szlig;','ss_',$dat[$totcnt]);
$dat[$totcnt]=str_replace('&Auml;','Ae_',$dat[$totcnt]);
$dat[$totcnt]=str_replace('&auml;','ae_',$dat[$totcnt]);
$dat[$totcnt]=str_replace('&Ouml;','Oe_',$dat[$totcnt]);
$dat[$totcnt]=str_replace('&ouml;','oe_',$dat[$totcnt]);
$dat[$totcnt]=str_replace('&Uuml;','Ue_',$dat[$totcnt]);
$dat[$totcnt]=str_replace('&uuml;','ue_',$dat[$totcnt]);
}
// END Pre-sorting (Umlaut -> normal letters)

// START Sorting //
function compare_towns($a, $b)
{
return
strnatcmp($a, $b);
}
usort($dat, 'compare_towns');
// END Sorting //

// START Post-sorting (normal letters -> Umlaut)
for($totcnt = 0; $totcnt < $max; $totcnt++){
$dat[$totcnt]=str_replace('ss_','&szlig;',$dat[$totcnt]);
$dat[$totcnt]=str_replace('Ae_','&Auml;',$dat[$totcnt]);
$dat[$totcnt]=str_replace('ae_','&auml;',$dat[$totcnt]);
$dat[$totcnt]=str_replace('Oe_','&Ouml;',$dat[$totcnt]);
$dat[$totcnt]=str_replace('oe_','&ouml;',$dat[$totcnt]);
$dat[$totcnt]=str_replace('Ue_','&Uuml;',$dat[$totcnt]);
$dat[$totcnt]=str_replace('ue_','&uuml;',$dat[$totcnt]);
}
// END Post-sorting (normal letters -> Umlaut)
?>
alishahnovin at hotmail dot com
17 年前
我有一個多維陣列,需要根據其中一個鍵值進行排序。以下是我的解決方案...

<?php
function msort($array, $id="id") {
$temp_array = array();
while(
count($array)>0) {
$lowest_id = 0;
$index=0;
foreach (
$array as $item) {
if (
$item[$id]<$array[$lowest_id][$id]) {
$lowest_id = $index;
}
$index++;
}
$temp_array[] = $array[$lowest_id];
$array = array_merge(array_slice($array, 0,$lowest_id), array_slice($array, $lowest_id+1));
}
return
$temp_array;
}
?>

範例

<?php

//糟糕,這不是按照 ID 排序的!!
$data[] = array("item"=>"item 4", "id"=>4);
$data[] = array("item"=>"item 1", "id"=>1);
$data[] = array("item"=>"item 3", "id"=>3);
$data[] = array("item"=>"item 2", "id"=>2);

var_dump( msort($data) ); //就用 msort 排序吧!

/* 輸出結果

array
0 =>
array
'item' => 'item 1' (長度=6)
'id' => 1
1 =>
array
'item' => 'item 2' (長度=6)
'id' => 2
2 =>
array
'item' => 'item 3' (長度=6)
'id' => 3
3 =>
array
'item' => 'item 4' (長度=6)
'id' => 4

*/

?>
alex [at] vkpb [dot] com
17 年前
使用插入排序法排序陣列。

<?


function sortByField($multArray,$sortField,$desc=true){
$tmpKey='';
$ResArray=array();

$maIndex=array_keys($multArray);
$maSize=count($multArray)-1;

for($i=0; $i < $maSize ; $i++) {

$minElement=$i;
$tempMin=$multArray[$maIndex[$i]][$sortField];
$tmpKey=$maIndex[$i];

for($j=$i+1; $j <= $maSize; $j++)
if($multArray[$maIndex[$j]][$sortField] < $tempMin ) {
$minElement=$j;
$tmpKey=$maIndex[$j];
$tempMin=$multArray[$maIndex[$j]][$sortField];

}
$maIndex[$minElement]=$maIndex[$i];
$maIndex[$i]=$tmpKey;
}

if($desc)
for($j=0;$j<=$maSize;$j++)
$ResArray[$maIndex[$j]]=$multArray[$maIndex[$j]];
else
for($j=$maSize;$j>=0;$j--)
$ResArray[$maIndex[$j]]=$multArray[$maIndex[$j]];

return $ResArray;
}

// 建立陣列
$array['aaa']=array("name"=>"vasia","order"=>1);
$array['bbb']=array("name"=>"petia","order"=>2);
$array['ccc']=array("name"=>"kolia","order"=>3);
$array['ddd']=array("name"=>"zenia","order"=>4);

// 設定排序
$SortOrder=0; // 預設遞減,1- 遞增

var_dump(sortByField($array,'order',$SortOrder));

array
'ddd' =>
array
'name' => 'zenia' (長度=5)
'order' => 4
'aaa' =>
array
'name' => 'vasia' (長度=5)
'order' => 1
'bbb' =>
array
'name' => 'petia' (長度=5)
'order' => 2
'ccc' =>
array
'name' => 'kolia' (長度=5)
'order' => 3

?>
Emiliyan at ServicesBG dot Com
18 年前
#這是一個用於排序陣列的函式...
function sort_by($array, $keyname = null, $sortby) {
$myarray = $inarray = array();
# 首先將鍵值儲存在一個單獨的陣列中
foreach ($array as $i => $befree) {
$myarray[$i] = $array[$i][$keyname];
}
# 根據以下方式排序新陣列
switch ($sortby) {
case 'asc'
# 排序陣列並維持索引關聯...
asort($myarray);
break;
case 'arsort'
# 以相反順序排序陣列並維持索引關聯
arsort($myarray);
break;
case 'natcasesor'
# 使用不區分大小寫的「自然排序」演算法排序陣列
natcasesort($myarray);
break;
}
# 重建舊陣列
foreach ( $myarray as $key => $befree) {
$inarray[$key] = $array[$key];
}
return $inarray;
}
sort_by() 範例...
$info = sort_by($myarray, 'name', $use = 'asc');
print_r($info);
nm at thenoodleman dot com
18 年前
更快、更有效的函式

array_sort (array, ['asc'/'desc'])

第二個參數指定升序或降序排序。預設為升序。

function array_sort($array, $type='asc'){
$result=array();
foreach($array as $var => $val){
$set=false;
foreach($result as $var2 => $val2){
if($set==false){
if($val > $val2 && $type=='desc' || $val < $val2 && $type=='asc'){
$temp=array();
foreach($result as $var3 => $val3){
if($var3==$var2) $set=true;
if($set){
$temp[$var3]=$val3;
unset($result[$var3]);
}
}
$result[$var]=$val;
foreach($temp as $var3 => $val3){
$result[$var3]=$val3;
}
}
}
}
if(!$set){
$result[$var]=$val;
}
}
return $result;
}

適用於按整數或字串排序,無需指定類型。

範例

$array=array('a' => 50, 'b' => 25, 'c' => 75);
print_r(array_sort($array));

返回
陣列
(
[b] => 25
[a] => 50
[c] => 75
)
james at miicro dot net
19 年前
請注意,如果您在多維陣列上使用此函式,PHP 會先排序第一個鍵,然後排序第二個鍵,依此類推。這類似於能夠使用 SQL 按照 field1、field2 等排序。

所以

陣列 (
[0] => 陣列 ( [category] => work [name] => Smith )
[1] => 陣列 ( [category] => play [name] => Johnson )
[2] => 陣列 ( [category] => work [name] => Berger )
)

將變成

陣列 (
[0] => 陣列 ( [category] => play [name] => Johnson )
[1] => 陣列 ( [category] => work [name] => Berger )
[2] => 陣列 ( [category] => work [name] => Smith )
)

希望對大家有幫助。
timc at hlyw dot com
19 年前
我研究了上面的 multi_sort 函式。但是,它們不適用於雜湊陣列(關聯陣列)。我添加了一個 keys 變數來追蹤陣列排序時的鍵值。歡迎提供回饋。

<?php
function array_qsort (&$array, $column=0, $order=SORT_ASC, $first=0, $last= -2)
{
// $array - the array to be sorted
// $column - index (column) on which to sort
// can be a string if using an associative array
// $order - SORT_ASC (default) for ascending or SORT_DESC for descending
// $first - start index (row) for partial array sort
// $last - stop index (row) for partial array sort
// $keys - array of key values for hash array sort

$keys = array_keys($array);
if(
$last == -2) $last = count($array) - 1;
if(
$last > $first) {
$alpha = $first;
$omega = $last;
$key_alpha = $keys[$alpha];
$key_omega = $keys[$omega];
$guess = $array[$key_alpha][$column];
while(
$omega >= $alpha) {
if(
$order == SORT_ASC) {
while(
$array[$key_alpha][$column] < $guess) {$alpha++; $key_alpha = $keys[$alpha]; }
while(
$array[$key_omega][$column] > $guess) {$omega--; $key_omega = $keys[$omega]; }
} else {
while(
$array[$key_alpha][$column] > $guess) {$alpha++; $key_alpha = $keys[$alpha]; }
while(
$array[$key_omega][$column] < $guess) {$omega--; $key_omega = $keys[$omega]; }
}
if(
$alpha > $omega) break;
$temporary = $array[$key_alpha];
$array[$key_alpha] = $array[$key_omega]; $alpha++;
$key_alpha = $keys[$alpha];
$array[$key_omega] = $temporary; $omega--;
$key_omega = $keys[$omega];
}
array_qsort ($array, $column, $order, $first, $omega);
array_qsort ($array, $column, $order, $alpha, $last);
}
}
?>
arjan321 at hotmail dot com
21 年前
如果您想要不區分大小寫的排序,請使用 natcasesort()
petr dot biza at gmail dot com
15 年前
這是一個透過子陣列的鍵排序陣列並保留頂層鍵的函式。

<?php
function sksort(&$array, $subkey="id", $sort_descending=false, $keep_keys_in_sub = false) {
$temp_array = $array;

foreach (
$temp_array as $key => &$value) {

$sort = array();
foreach (
$value as $index => $val) {
$sort[$index] = $val[$subkey];
}

asort($sort);

$keys = array_keys($sort);
$newValue = array();
foreach (
$keys as $index) {
if(
$keep_keys_in_sub)
$newValue[$index] = $value[$index];
else
$newValue[] = $value[$index];
}

if(
$sort_descending)
$value = array_reverse($newValue, $keep_keys_in_sub);
else
$value = $newValue;
}

$array = $temp_array;
}
?>
g8z at yahoo dot com
18 年前
<?php
/**
This sort function allows you to sort an associative array while "sticking" some fields.

$sticky_fields = an array of fields that should not be re-sorted. This is a method of achieving sub-sorts within contiguous groups of records that have common data in some fields.

Courtesy of the $5 Script Archive: http://www.tufat.com
**/

define( 'ASC_AZ', 1000 );
define( 'DESC_AZ', 1001 );
define( 'ASC_NUM', 1002 );
define( 'DESC_NUM', 1003 );

function
stickysort( $arr, $field, $sort_type, $sticky_fields = array() ) {
$i = 0;
foreach (
$arr as $value) {
$is_contiguous = true;
if(!empty(
$grouped_arr)) {
$last_value = end($grouped_arr[$i]);

if(!(
$sticky_fields == array())) {
foreach (
$sticky_fields as $sticky_field) {
if (
$value[$sticky_field] <> $last_value[$sticky_field]) {
$is_contiguous = false;
break;
}
}
}
}
if (
$is_contiguous)
$grouped_arr[$i][] = $value;
else
$grouped_arr[++$i][] = $value;
}
$code = '';
switch(
$sort_type) {
case
ASC_AZ:
$code .= 'return strcasecmp($a["'.$field.'"], $b["'.$field.'"]);';
break;
case
DESC_AZ:
$code .= 'return (-1*strcasecmp($a["'.$field.'"], $b["'.$field.'"]));';
break;
case
ASC_NUM:
$code .= 'return ($a["'.$field.'"] - $b["'.$field.'"]);';
break;
case
DESC_NUM:
$code .= 'return ($b["'.$field.'"] - $a["'.$field.'"]);';
break;
}

$compare = create_function('$a, $b', $code);

foreach(
$grouped_arr as $grouped_arr_key=>$grouped_arr_value)
usort ( $grouped_arr[$grouped_arr_key], $compare );

$arr = array();
foreach(
$grouped_arr as $grouped_arr_key=>$grouped_arr_value)
foreach(
$grouped_arr[$grouped_arr_key] as $grouped_arr_arr_key=>$grouped_arr_arr_value)
$arr[] = $grouped_arr[$grouped_arr_key][$grouped_arr_arr_key];

return
$arr;
}
?>
raul at jimi dot com dot mx
19 年前
我有一個像這樣的陣列
$arr=array (1,4,3,6,5);

它會返回這個
$arr[0]=1
$arr[1]=4
$arr[2]=3
$arr[3]=6
$arr[4]=5

但假設我移除 [2],也就是數字 3,我會得到

$arr[0]=1
$arr[1]=4
$arr[3]=6
$arr[4]=5

而我想要重新索引而不進行排序,因為我不想失去數字的順序(就像堆疊中的 pop,但在列表中間),我這樣做

$arr=array_chunk($arr,count($arr));
$arr=$arr[0];

結果是

$arr[0]=1
$arr[1]=4
$arr[2]=6
$arr[3]=5

這主要可以用於樹狀排序,當你只有節點的 id 和父值,並且你想要有 N 個層級時。
poulou_0 at hotmail dot com
13 年前
如果你不關心大小寫排序

<?php
//在
$sortable_array[$k] = $v2;
//的地方改成
$sortable_array[$k] = strtolower($v2);

//以及在
$sortable_array[$k] = $v;
//的地方改成
$sortable_array[$k] = strtolower($v);
?>
g8z at yahoo dot com
18 年前
<?php
/**
This sort function allows you to sort an associative array while "sticking" some fields.

$sticky_fields = an array of fields that should not be re-sorted. This is a method of achieving sub-sorts within contiguous groups of records that have common data in some fields.

For example:

$a = array();

$a []= array(
'name' => 'Sam',
'age' => 23,
'hire_date' => '2004-01-01'
);
$a []= array(
'name' => 'Sam',
'age' => 44,
'hire_date' => '2003-03-23'
);
$a []= array(
'name' => 'Jenny',
'age' => 20,
'hire_date' => '2000-12-31'
);
$a []= array(
'name' => 'Samantha',
'age' => 50,
'hire_date' => '2000-12-14'
);

$sticky_fields = array( 'name' );
print_r( stickysort( $a, 'age', DESC_NUM, $sticky_fields ) );

OUTPUT:

Array
(
[0] => Array
(
[name] => Sam
[age] => 44
[hire_date] => 2003-03-23
)
[1] => Array
(
[name] => Sam
[age] => 23
[hire_date] => 2004-01-01
)
[2] => Array
(
[name] => Jenny
[age] => 20
[hire_date] => 2000-12-31
)
[3] => Array
(
[name] => Samantha
[age] => 50
[hire_date] => 2000-12-14
)
)

Here's why this is the correct output - the "name" field is sticky, so it cannot change its sort order. Thus, the "age" field is only sorted as a sub-sort within records where "name" is identical. Thus, the "Sam" records are reversed, because 44 > 23, but Samantha remains at the bottom, even though her age is 50. This is a way of achieving "sub-sorts" and "sub-sub-sorts" (and so on) within records of identical data for specific fields.

Courtesy of the $5 Script Archive: http://www.tufat.com
**/

define( 'ASC_AZ', 1000 );
define( 'DESC_AZ', 1001 );
define( 'ASC_NUM', 1002 );
define( 'DESC_NUM', 1003 );

function
stickysort( $arr, $field, $sort_type, $sticky_fields = array() ) {
$i = 0;
foreach (
$arr as $value) {
$is_contiguous = true;
if(!empty(
$grouped_arr)) {
$last_value = end($grouped_arr[$i]);

if(!(
$sticky_fields == array())) {
foreach (
$sticky_fields as $sticky_field) {
if (
$value[$sticky_field] <> $last_value[$sticky_field]) {
$is_contiguous = false;
break;
}
}
}
}
if (
$is_contiguous)
$grouped_arr[$i][] = $value;
else
$grouped_arr[++$i][] = $value;
}
$code = '';
switch(
$sort_type) {
case
ASC_AZ:
$code .= 'return strcasecmp($a["'.$field.'"], $b["'.$field.'"]);';
break;
case
DESC_AZ:
$code .= 'return (-1*strcasecmp($a["'.$field.'"], $b["'.$field.'"]));';
break;
case
ASC_NUM:
$code .= 'return ($a["'.$field.'"] - $b["'.$field.'"]);';
break;
case
DESC_NUM:
$code .= 'return ($b["'.$field.'"] - $a["'.$field.'"]);';
break;
}

$compare = create_function('$a, $b', $code);

foreach(
$grouped_arr as $grouped_arr_key=>$grouped_arr_value)
usort ( $grouped_arr[$grouped_arr_key], $compare );

$arr = array();
foreach(
$grouped_arr as $grouped_arr_key=>$grouped_arr_value)
foreach(
$grouped_arr[$grouped_arr_key] as $grouped_arr_arr_key=>$grouped_arr_arr_value)
$arr[] = $grouped_arr[$grouped_arr_key][$grouped_arr_arr_key];

return
$arr;
}
?>
Brecht Cloetens
15 年前
<?php

/**
* 函式:array_columns
* 作者:Brecht Cloetens
* 參數:$a = array() // 原始陣列
* $c = int() // 欄位數
*/
function array_columns(&$a, $c=2)
{
$m = ceil(count($a)/$c);
$j = 0;
for(
$i=0; $i<$m; $i++) {
for(
$k=0; $k<$c; $k++) {
$key = $i+($m*$k);
settype($key,'integer');
if(
array_key_exists($key,$a)) {
$b[$j] = $a[$key];
$j++;
}
}
}
$a = $b;
}

$arr = range('a','z');
array_columns($arr,4);
print_r($arr);

?>

範例
陣列 array(1,2,3,4,5) 會被轉換成 array(1,4,2,5,3);

如果您想要將一個陣列顯示成指定欄位數,這個方法會很方便。

<table>
<tr>
<td>$arr[0] => 1</td>
<td>$arr[1] => 4</td>
</tr>
<tr>
<td>$arr[2] => 2</td>
<td>$arr[3] => 5</td>
</tr>
<tr>
<td>$arr[4] => 3</td>
<td></td>
</tr>
</table>
www at designdetector dot com
16 年前
要按字母順序排序包含多個文字欄位的陣列,您必須先將文字轉換為小寫,然後再排序陣列。 否則 PHP 會將縮寫放在單字之前。 您可以在我的程式碼範例中看到這一點。 只要將原始文字欄位儲存在陣列行的末尾,然後再從那裡呼叫它即可。 您可以放心地忽略添加到陣列行開頭的小寫版本。

<?php
echo '<pre>原始資料:
<br />'
;

$data = array(
'Saturn|7|8|9|0||',
'Hello|0|1|2|3||',
'SFX|5|3|2|4||',
'HP|9|0|5|6||'
);

print_r($data);

sort($data);
reset($data);

echo
'<br />原始排序:
<br />'
;

print_r($data);

for (
$c = 0; $c < count($data); $c++) {
list (
$letter,$g1,$g2,$g3,$g4,$end) = explode ('|', $data[$c]);
$lowercase = strtolower($letter);
$data2[$c] = array($lowercase,$g1,$g2,$g3,$g4,$letter);
}

sort($data2);
reset($data2);

echo
'<br />小寫排序:
<br />'
;

print_r($data2);

echo
'</pre>';
?>
sinan at sinaneldem dot com
17 年前
這是一個用於合併陣列、移除重複元素並按字母順序排序的小腳本。

<?php

$array1
= array('apple', 'banana','pear');
$array2 = array('grape', 'pear','orange');

function
array_unique_merge_sort($array1, $array2){
$array = array_unique(array_merge($array1, $array2));
sort($array);
foreach (
$array as $key => $value) {
$new[$key] = $value;
}
return
$new;
}

print_r (array_unique_merge_sort($array1, $array2));

?>

這將會印出

Array ( [0] => apple [1] => banana [2] => grape [3] => orange [4] => pear )
anaz114119 at gmail dot com
13 年前
從文字檔依欄位排序
範例:姓名||日期||時間||註解
如果您想依日期排序
$column = 2
<?php
function array_sort($array,$column){
$column = $column-1;
foreach(
$array as $line){
$bits = explode("||",$line);
$bits = "$bits[$column]**$line";
$array1[]=$bits;
}
asort($array1);
foreach(
$array1 as $line){
$bit = explode("**",$line);
$bit = "$bit[1]";
$array2[]=$bit;
}
return
$array2;
}
?>
anthony at ectrolinux dot com
20 年前
簡要補充前一位發文者的訊息,PHP 使用的升冪排序順序直接對應於 ISO-8859-1 (ASCII)。因此,字元 \48(數字 0)會放在字元 \82(R)之前,而字元 \82(R)會放在字元 \110(n)之前,依此類推。
To Top