PHP 日本研討會 2024

asort

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

asort以遞增順序排序陣列並維持索引關聯

說明

asort(array &$array, int $flags = SORT_REGULAR): true

就地以遞增順序排序 array,使其鍵保持與其關聯值之間的關聯性。

當排序關聯陣列且實際元素順序很重要時,主要會使用此方法。

注意:

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

注意:

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

參數

array

輸入陣列。

flags

選用的第二個參數 flags 可用於修改排序行為,方法是使用這些值

排序型別旗標

傳回值

一律傳回 true

變更記錄

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

範例

範例 1 asort() 範例

<?php
$fruits
= array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
asort($fruits);
foreach (
$fruits as $key => $val) {
echo
"$key = $val\n";
}
?>

上面的範例會輸出

c = apple
b = banana
d = lemon
a = orange

水果已依字母順序排序,並且每個元素關聯的索引已保留。

另請參閱

新增註解

使用者提供的註解 31 則註解

nick ([AT]) nickyost ([DOT]) com
13 年前
藉由使用自訂排序函式中的個別值,可以使用此函式來排序多維陣列,幾乎不需要任何工作。

即使子元素不是字串,此函式也會傳遞整個子元素。如果它是陣列,如同多維陣列的情況,它會將整個子陣列當作一個參數傳遞。

因此,執行像這樣的優雅操作

<?php
// 排序多維陣列
usort($results, "custom_sort");
// 定義自訂排序函式
function custom_sort($a,$b) {
return
$a['some_sub_var']>$b['some_sub_var'];
}
?>

這在 4 行內完成了其他函式需要 40 到 50 行才能完成的工作。這不需要您建立暫存陣列或任何東西。對我而言,這是非常偏好的解決方案。

希望對您有幫助!
aditycse at gmail dot com
9 年前
/*
* 名稱:Aditya Mehrotra
* 電子郵件:aditycse@gmail.com
*/
//依值排序也具有區分大小寫資料的字母數字陣列的範例
$exampleArray1 = $exampleArray2 = array(
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
)
*/
richard at happymango dot me dot uk
18 年前
這是一個函式,用於依照指定的子陣列鍵,以遞增或遞減的方式排序索引的 2D 陣列。

它適用於在查詢返回後,依照特定欄位排序資料庫的查詢結果。

此函式可能會佔用較多資源。它會將陣列重新建立為雜湊以使用 ksort(),然後再轉回陣列。

預設會以遞增方式排序,但如果您將 $reverse 指定為 true,則會傳回遞減排序的記錄。

<?php

function record_sort($records, $field, $reverse=false)
{
$hash = array();

foreach(
$records as $record)
{
$hash[$record[$field]] = $record;
}

(
$reverse)? krsort($hash) : ksort($hash);

$records = array();

foreach(
$hash as $record)
{
$records []= $record;
}

return
$records;
}

// 以下範例

$airports = array
(
array(
"code" => "LHR", "name" => "Heathrow" ),
array(
"code" => "LGW", "name" => "Gatwick" ),
);

printf("Before: <pre>%s</pre>", print_r($airports, true));

$airports = record_sort($airports, "name");

printf("After: <pre>%s</pre>", print_r($airports, true));

?>

範例輸出

Before: Array
(
[0] => Array ( [code] => LHR, [name] => Heathrow )
[1] => Array ( [code] => LGW, [name] => Gatwick )
)

After: Array
(
[0] => Array ( [code] => LGW, [name] => Gatwick )
[1] => Array ( [code] => LHR, [name] => Heathrow )
)
mike at clear-link dot com
16 年前
在最近的一個專案中,我需要先按值,然後在特定值出現多次時按鍵排序關聯陣列。我編寫了這個函式來完成這項任務。請注意,參數預設為按鍵和值都遞增排序,但也允許對每個參數進行精細控制。

<?php
function aksort(&$array,$valrev=false,$keyrev=false) {
if (
$valrev) { arsort($array); } else { asort($array); }
$vals = array_count_values($array);
$i = 0;
foreach (
$vals AS $val=>$num) {
$first = array_splice($array,0,$i);
$tmp = array_splice($array,0,$num);
if (
$keyrev) { krsort($tmp); } else { ksort($tmp); }
$array = array_merge($first,$tmp,$array);
unset(
$tmp);
$i = $num;
}
}

// 範例
$tmp = array('ca'=>1,'cb'=>2,'ce'=>1,'pa'=>2,'pe'=>1);

// 標準 asort
asort($tmp);
print_r($tmp);

// 按值遞增,按鍵遞增排序
aksort($tmp);
print_r($tmp);

// 按值遞減,按鍵遞增排序
aksort($tmp,true);
print_r($tmp);

// 按值遞減,按鍵遞減排序
aksort($tmp,true,true);
print_r($tmp);

// 結果
Array
(
[
pe] => 1
[ca] => 1
[ce] => 1
[cb] => 2
[pa] => 2
)
Array
(
[
ca] => 1
[ce] => 1
[pe] => 1
[cb] => 2
[pa] => 2
)
Array
(
[
cb] => 2
[pa] => 2
[ca] => 1
[ce] => 1
[pe] => 1
)
Array
(
[
pa] => 2
[cb] => 2
[pe] => 1
[ce] => 1
[ca] => 1
)
sweetland at whoadammit dot com
24 年前
這是一個我快速編寫的小例程,用於排序多維陣列
<?php
/**
** comesafter ($s1, $s2)
**
** 如果 $s1 在字母順序上晚於 $s2,則返回 1,否則返回 0。
**/

function comesafter ($s1, $s2) {
/**
** 我們不希望超出其中一個字串的邊界並導致記憶體區段錯誤,
** 所以讓我們看看哪個字串較短。
**/

$order = 1;

if (
strlen ($s1) > strlen ($s2)) {
$temp = $s1;
$s1 = $s2;
$s2 = $temp;
$order = 0;
}

for (
$index = 0; $index < strlen ($s1); $index++) {
/**
** $s1 在 $s2 之後
**/

if ($s1[$index] > $s2[$index]) return ($order);

/**
** $s1 在 $s2 之前
**/

if ($s1[$index] < $s2[$index]) return (1 - $order);
}

/**
** $s1 是 $s2 的子字串的特殊情況
**/

return ($order);
}

/**
** asortbyindex ($sortarray, $index)
**
** 依據第二層索引對多維陣列進行排序。例如,group 和 user 陣列的第 I 個成員的第 0 個索引都是字串識別符。
** 在 user 陣列中,這是使用者名稱;在 group 陣列中,這是群組名稱。
** asortby
**/

function asortbyindex ($sortarray, $index) {
$lastindex = count ($sortarray) - 1;
for (
$subindex = 0; $subindex < $lastindex; $subindex++) {
$lastiteration = $lastindex - $subindex;
for (
$iteration = 0; $iteration < $lastiteration; $iteration++) {
$nextchar = 0;
if (
comesafter ($sortarray[$iteration][$index], $sortarray[$iteration + 1][$index])) {
$temp = $sortarray[$iteration];
$sortarray[$iteration] = $sortarray[$iteration + 1];
$sortarray[$iteration + 1] = $temp;
}
}
}
return (
$sortarray);
}
?>

程式碼有點長,包含很多註解,但我希望它對您有所幫助。
php at web-in-time dot com
18 年前
acecream 的函式運作良好,尤其是在 spectre 擴充功能的情況下。

然而,有時候必須保留索引值。若要達成此目的,只需將

$sorted_arr[] = $array[$arr_key];

替換為

$sorted_arr[$arr_key] = $array[$arr_key];
mike at clear-link dot com
16 年前
我剛剛提交的 aksort 函式中存在一個小小的錯字。以下是整個函式,並標註了修正之處

<?php
function aksort(&$array,$valrev=false,$keyrev=false) {
if (
$valrev) { arsort($array); } else { asort($array); }
$vals = array_count_values($array);
$i = 0;
foreach (
$vals AS $val=>$num) {
$first = array_splice($array,0,$i);
$tmp = array_splice($array,0,$num);
if (
$keyrev) { krsort($tmp); } else { ksort($tmp); }
$array = array_merge($first,$tmp,$array);
unset(
$tmp);
$i = $i+$num;
// 從先前的文章修正:$i = $num;
}
}
?>
mbevan at marginsoftware dot com
22 年前
別在意... 將我最後的筆記當作一個快速提示:如果您希望保留鍵值,請使用 asort() 和 arsort() 來取代 sort() 和 rsort()。
jacko at kring dot co dot uk
24 年前
asort 有一個令人惱火的功能,它會忽略資料中任何預設或隱含的順序。也就是說,如果陣列中有兩個元素包含 "banana",則無法保證排序後第一個元素仍然是第一個。
這使得 Burrows-Wheeler 區塊排序的實作變得有點麻煩,必須在排序之前將尾隨字串附加到所有字串,並在排序之後移除。若要維持所謂的 "banana" 順序。
richard at happymango dot me dot uk
18 年前
這是我在下面發佈的同一個函式的修正版本。現在它將能夠處理排序欄位中的重複項目。例如:如果有兩個記錄的名稱是 Heathrow,它仍然能夠正常運作。

<?php

function record_sort($records, $field, $reverse=false)
{
$hash = array();

foreach(
$records as $key => $record)
{
$hash[$record[$field].$key] = $record;
}

(
$reverse)? krsort($hash) : ksort($hash);

$records = array();

foreach(
$hash as $record)
{
$records []= $record;
}

return
$records;
}

?>
freeman at generalresources dot com
23 年前
asortbyindex($sortarray, $index) 看起來像是 sort 而不是 asort。$sortarray 的鍵值已變更。
rojaro
20 年前
依據第二個索引值對陣列進行進階排序的函式,它會產生遞增(預設)或遞減的輸出,並且選擇性地使用自然不區分大小寫的排序(也可以選擇區分大小寫)。
只需要前兩個引數。

<?php

function sabsi ($array, $index, $order='asc', $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) ($order=='asc')? asort($temp) : arsort($temp);
else {
(
$case_sensitive)? natsort($temp) : natcasesort($temp);
if(
$order!='asc') $temp=array_reverse($temp,TRUE);
}
foreach(
array_keys($temp) as $key) (is_numeric($key))? $sorted[]=$array[$key] : $sorted[$key]=$array[$key];
return
$sorted;
}
return
$array;
}

?>
Anon
13 年前
單行程式碼實現不區分大小寫排序

<?php

array_multisort
(array_map('strtolower', $array), $array);

?>
rcwang at cmu dot edu
22 年前
這是我的版本,用於依照第二個索引排序多維陣列。
您可以自由修改程式碼以符合您的需求。

<?php
function aSortBySecondIndex($multiArray, $secondIndex) {
while (list(
$firstIndex, ) = each($multiArray))
$indexMap[$firstIndex] = $multiArray[$firstIndex][$secondIndex];
asort($indexMap);
while (list(
$firstIndex, ) = each($indexMap))
if (
is_numeric($firstIndex))
$sortedArray[] = $multiArray[$firstIndex];
else
$sortedArray[$firstIndex] = $multiArray[$firstIndex];
return
$sortedArray;
}
?>
salchicha at cable dot net dot co
22 年前
這是我想出來的一個方法,讓您可以依照成員或函式來排序特定類別的陣列

<?php
// 依照類別的其中一個成員排序(甚至可以小寫!!!)
function casort($arr, $var) {
$tarr = array();
$rarr = array();
for(
$i = 0; $i < count($arr); $i++) {
$element = $arr[$i];
$tarr[] = strtolower($element->{$var});
}

reset($tarr);
asort($tarr);
$karr = array_keys($tarr);
for(
$i = 0; $i < count($tarr); $i++) {
$rarr[] = $arr[intval($karr[$i])];
}

return
$rarr;
}
?>

它運作良好。例如,我有一個 Room 類別,其中包含 title、isActive()、date 等成員。我可以使用 casort($rooms, "title") 或 casort($rooms, "isActive()") 來排序陣列,而且可以正常運作。
Jesse K
4 年前
'asort' 非常適合用於排序英文的陣列,但如果陣列中存在重音字元,則最好使用 PHP Collator 類別的 'asort' 方法
https://php.dev.org.tw/manual/en/class.collator.php

$collator = new \Collator('fr_CA');
$collator->asort($french_list);

可以使用 `setlocale()` 來控制 `asort` 的行為,但這在不同系統之間並不可靠。
例如,在我的開發環境中,我只能存取下列的語言環境

$ locale -a
C
C.UTF-8
POSIX
Anonymous
22 年前
與上述類似,但適用於陣列的陣列,而非物件的陣列。

<?php
function aasort($x,$var,$cmp='strcasecmp'){
if (
is_string($var) ) $var = "'$var'";
uasort($x,
create_function('$a,$b',
'return '.$cmp.'( $a['.$var.'],$b['.$var.']);')
);
return
$x;
}
?>
marty8zhang at gmail dot com
4 年前
「此函式會排序陣列,讓陣列索引維持與其關聯的陣列元素的相關性。」

說明中的這句話具有非常重要的含義,尤其是在您使用原本未索引(或說以整數索引)的陣列和 JSON 編碼/解碼時。
我並未將此回報為錯誤,因為最終結果確實符合說明。

<?php

$myArray
= ['small_image', 'image'];
var_dump(json_encode($myArray)); // string(23) "["small_image","image"]"
var_dump(is_object($myArray)); // bool(false)

asort($myArray);
$myJson = json_encode($myArray);
var_dump($myJson); // string(31) "{"1":"image","0":"small_image"}"
var_dump(is_object($myArray)); // bool(false)

/*
* class stdClass#1 (2) {
* public $1 =>
* string(5) "image"
* public $0 =>
* string(11) "small_image"
* }
*/
var_dump(json_decode($myJson));

?>
stephen [ at ] brooksie-net [ dot ] co [ dot ] uk
11 年前
很明顯地,必須記錄使用的索引鍵,以免覆寫陣列中的先前項目;o)

請注意,這也會影響時間,但仍然比其他替代方案快

* int : 0.00159 (毫秒)
* str : 0.00092 (毫秒)

<?php
private function _keySort(Array $data)
{
$keys = array();

foreach(
$data as $row) {

$keyIncrement =
(!isset(
$keys[$row[$this->_orderField]]))
?
$keys[$row[$this->_orderField]] = 0
: ++$keys[$row[$this->_orderField]];

$tempArray[$row[$this->_orderField].$keyIncrement] = $row;
}

if (
$this->_orderDirection == 'DESC') {
krsort($tempArray, SORT_NATURAL | SORT_FLAG_CASE );
} else {
ksort($tempArray, SORT_NATURAL | SORT_FLAG_CASE);
}

return
$tempArray;

}
?>
przemekkus [at] interia [dot] pl
17 年前
由 chello dot nl 的點 brandon 所撰寫的函式有一個錯誤 - 變數名稱錯誤。它應該是

if($rev) arsort($named_hash,$flags=0) ;

而不是

if($reverse) arsort($named_hash,$flags=0) ;
gunnar at taljaren dot se
17 年前
for ($i=0;$i<5;$i++)
$values[] = $i;
asort($values);

可以運作,但是
for ($i=0;$i<5;$i++)
$values[$i] =$i;
asort($values);
卻不行!
smileaf at smileaf dot org
17 年前
好的,我弄錯了,在重新閱讀先前的貼文後,發現 ".$key" 很重要。造成我排序問題的根本原因並非如此。而是其他原因。
在傳回之前執行:asort($records, $flags); 可以解決排序問題。
我所指的排序問題會導致對數字資料進行基於字元的排序。
因此,原本應該是
1
2
3
...
10
12
20
結果傳回卻變成
1
10
12
2
20
3
...
基本上這就是我一開始想要修正的問題。
Eran
15 年前
我為某個需要從文字檔案讀取資料而不是使用 sql - order by 陳述式的人製作了這個範例多維陣列排序。

這個想法是取得索引鍵並排序(排列)特定欄位,然後根據所選欄位 asort 傳回的結果來排序整個陣列。

<?php
/**
*
* 這個範例是讀取文字資料
* 並對二維陣列執行排序
* 就像一般 sql 的 "order by asc" 一樣
*
*/

$foo = array();

/*
# SORT_REGULAR - 正常比較項目(不變更類型)
# SORT_NUMERIC - 以數值比較項目
# SORT_STRING - 以字串比較項目
*/
$sort_by = SORT_REGULAR;

/*
# 0 - 依 name 欄位排序
# 1 - 依 age 欄位排序
# 2 - 依 rank 欄位排序
# 3 - 依 color 欄位排序
*/
$order_by = 1;

// 來源檔案
$line_of_text[1] = 'a1name|f2age|h3rank|jcolor';
$line_of_text[2] = 'b1name|d2age|i3rank|k4color';
$line_of_text[0] = 'c1name|e2age|g3rank|l4color';

// 建立陣列
for ($x=0; $x<=2; $x++)
{
$line = explode('|',$line_of_text[$x]);

// 依欄位儲存,否則會像列一樣儲存
for ($i=0; $i<=3; $i++) {
$foo[$i][$x] = $line[$i];
}
}

// 取得索引鍵的順序
$a = $foo[$order_by];

// 排序
asort($a, $sort_by);

// 開始列印
echo "<table cellpudding=0 cellspacing=0 border=1>\n";
echo
"<tr>\n";
echo
"<td>key</td>\n";
echo
"<td>name</td>\n";
echo
"<td>age</td>\n";
echo
"<td>rank</td>\n";
echo
"<td>color</td>\n";
echo
"</tr>\n";

// 依索引鍵順序列印
foreach ($a as $k => $v) {
echo
"<tr>\n";
echo
"<td>$k</td>\n";
// 您可以在這裡列印一個 for 迴圈 (0 到欄位的數量 [=3])
echo "<td>".$foo[0][$k]."</td>\n";
echo
"<td>".$foo[1][$k]."</td>\n";
echo
"<td>".$foo[2][$k]."</td>\n";
echo
"<td>".$foo[3][$k]."</td>\n";
echo
"</tr>\n";
}
echo
"</table>\n";
?>
spectre at hellfish dot NOSPAM dot org
21 年前
這方法運作良好,但如果在排序之前刪除一個或多個陣列索引,則會中斷結果陣列。這一個應該可以修正這個問題

變更
for ($i = 0; $i < sizeof($array); $i++) {


foreach ($array as $i => $k) {
a dot brandon at chello dot nl
17 年前
我將此用於類似 SQL 的 orderby。大致基於 smileaf。對你們這些書呆子有幫助嗎?

<?

function named_records_sort($named_recs, $order_by, $rev=false, $flags=0)
{// 建立一個僅包含
// 排序欄位(而不是記錄)值的一維命名陣列
$named_hash = array();
foreach($named_recs as $key=>$fields)
$named_hash["$key"] = $fields[$order_by];

// 排序一維陣列,
// 維持索引鍵與值的關係
if($reverse) arsort($named_hash,$flags=0) ;
else asort($named_hash, $flags=0);

// 建立一個已排序記錄陣列的副本
// 按照排序陣列的順序
$sorted_records = array();
foreach($named_hash as $key=>$val)
$sorted_records["$key"]= $named_recs[$key];

return $sorted_records;} // named_recs_sort()

function show_sorted_records($named_recs, $order_by, $rev=false, $flags=0)
{$sorted_records=named_records_sort($named_recs, $order_by, $rev, $flags);
foreach($sorted_records as $name=>$fields)
{echo "<b>$name</b> ";
foreach($fields as $field=>$val)
echo "$field = $val "; echo "<br>";}
} // show_sorted_records()

$girl_friends=array();
$girl_friends["Anna"]=
array("born"=>'1989-08-22',"cupsize"=>'B-',"IQ"=>105, "daddy"=>'rich');
$girl_friends["Zoe"]
=array("born"=>'1978-03-11',"cupsize"=>'C#',"IQ"=>130, "daddy"=>'poor');
$girl_friends["Lilly"]
=array("born"=>'1985-06-16',"cupsize"=>'DD',"IQ"=>90, "daddy"=>'nasty');

$order_by="cupsize"; echo "得獎者是: <br>";
show_sorted_records($girl_friends, $order_by, true);

?>
bwuhlman at tallships dot ca
24 年前
嗯,實際上,asort 有*兩個*令人討厭的特性。

它可以完美地排序雜湊(或者您可能擁有的關聯陣列),但頑固地拒絕在維護索引關聯的情況下排序常規陣列。這有點道理,但文件並未明確說明您不能這樣做。

唉。
rick at toewsweb dot net
13 年前
關於先依值排序,然後再依索引鍵排序(參閱 2008-01-31 mike at clear-link dot com 的筆記)

我想到解決這個問題的方法是將索引鍵和值擷取到個別的陣列中,然後使用 array_multisort 來取得所需的順序

例如
<?php
$kvpairs
= array('noun' => 'thought', 'animal' => 'fish', 'abstract' => 'thought', 'food' => 'fish', 'verb' => 'fish');
print
"before:\n";
print_r($kvpairs);

// 基本上,排序只需要一行程式碼:
array_multisort(array_values($kvpairs), array_keys($kvpairs), $kvpairs);

print
"after:\n";
print_r($kvpairs);
?>

之前
陣列
(
[noun] => thought
[animal] => fish
[abstract] => thought
[food] => fish
[verb] => fish
)
之後
陣列
(
[animal] => fish
[food] => fish
[verb] => fish
[abstract] => thought
[noun] => thought
)

當然,array_multisort 允許您為傳遞的每個陣列指定排序順序(SORT_ASC、SORT_DESC)和排序類型(SORT_REGULAR、SORT_STRING、SORT_NUMERIC)。
phzzzt .a.t. acm .d.o.t. org
22 年前
與上述類似,但適用於陣列的陣列,而非物件的陣列。

<?php
function aasort($x,$var,$cmp='strcasecmp'){
if (
is_string($var) ) $var = "\'$var\'";
uasort($x,
create_function('$a,$b',
'return '.$cmp.'( $a['.$var.'],$b['.$var.']);')
);
return
$x;
}
?>
elhanafi123 at gmail dot com
6 年前
我寫了這個函數,以便使用特定的鍵對多維陣列進行排序。

<?php
function sort_array($array, $sort_value, $reverse = false){
$value = $result = array();

foreach(
$array as $key => $rows){
$value[$key] = strtolower($rows[$sort_value]);
}

if(
$reverse == true){
arsort($value);
}else{
asort($value);
}

foreach(
$value as $keys => $null){
$result[] = $array[$keys];
}

return
$result;
}
?>

範例

<?php

$array
= array(array('a' => 'foo'), array('a' => 'foo4'), array('a' => 'foo2'), array('a' => 'foo3'));
print_r($array);
//Array ( [0] => Array ( [a] => foo ) [1] => Array ( [a] => foo4 ) [2] => Array ( [a] => foo2 ) [3] => Array ( [a] => foo3 ) )

print_r(sort_array($array, 'a'));
//Array ( [0] => Array ( [a] => foo ) [1] => Array ( [a] => foo2 ) [2] => Array ( [a] => foo3 ) [3] => Array ( [a] => foo4 ) )

print_r(sort_array($array, 'a', true));
//Array ( [0] => Array ( [a] => foo4 ) [1] => Array ( [a] => foo3 ) [2] => Array ( [a] => foo2 ) [3] => Array ( [a] => foo ) )

?>
bakatamas at freemail dot hu
16 年前
親愛的 mike at clear-link dot com!

我需要您函數的不區分大小寫版本。它仍然不完美,因為我必須處理特定國家/地區的字元 (öüóőúéáűíÖÜÓŐÚÉÁŰÍ)

function akisort(&$array,$valrev=false,$keyrev=false)
{
if ($valrev)
{
arsort($array);
}
else
{
asort($array);
};
$vals = array_count_values($array);
$i = 0;
foreach ($vals AS $val=>$num)
{
$first = array_splice($array,0,$i);
$tmp = array_splice($array,0,$num);
$tmp2 = array();
foreach($tmp as $key => $value)
{
$tmp2[] = $key;
$number = $value;
};
natcasesort($tmp2);
reset($tmp2);
print_r($tmp2);
unset($tmp);
foreach($tmp2 as $key => $value)
{
$tmp[$value] = $number;
};
if($keyrev)
{
$tmp = array_reverse($tmp, true);
};
$array = array_merge($first,$tmp,$array);
unset($tmp);
$i = $i+$num;
};
};
mzvarik at gmail dot com
16 年前
我注意到我之前提到的函數非常具有誤導性 - 請某人刪除該註解!

這就是您排序的方式
<?php
setlocale
(LC_ALL, 'czech');
$array = array("a", "č", "c");
usort ($array, 'strcoll');
print_r($array);
?>
To Top