PHP array_Multisort()関数の使用チェック

7404 ワード

関数bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $...]]] )
パラメータの説明:関数は複数の配列または多次元配列をソートします.
最初のパラメータは配列であり、その後の各パラメータは配列であり、次のソート順フラグである可能性があります.
SORT_ASC-デフォルト、昇順
SORT_DESC-降順
ソートのタイプを指定できます
SORT_REGULAR-デフォルト.各項目を通常の順序で並べます.
SORT_NUMERIC-各項目を数値順に並べます.
SORT_STRING-各項目をアルファベット順に並べます.
インスタンスコード
 
  
$arr1 = array('10', 11, 100, 100, 'a');
$arr2 = array(1, 2, 3, '2', 5);
array_multisort($arr1, $arr2);

結果:
$arr1
Array ( [0] => 10 [1] => a [2] => 11 [3] => 100 [4] => 100 )
#'10'は11,100,100と比較すると整数10に変換され、他の3つの数より小さい
#'10'は'a'比較時に文字列として使用され、その最初の文字'1'ascii符号値は49が'a'(ascii値は97)未満であるため、'10'は最小要素である
#'a'は他の3つの数字を比較する場合、整数0に変換され、他の3つの数より小さい
$arr2
Array ( [0] => 1 [1] => 5 [2] => 2 [3] => 2 [4] => 3 )
#$arr 2要素1は$arr 1要素'10'の位置に対応するため、[0]の位置に並ぶ
#$arr 1[2]=>100,$arr 1[3]=>100はそれぞれ$arr 2元素3,'2'に対応する.3は'2'より大きいので、2に対応する$arr 1[2]=>100のソート後の下付き文字は
3,3に対応する$arr 1[3]=>100のソートの下に4
まとめ
1.並べ替えに参加する配列要素の数を一致させる
2.配列要素の並べ替え位置には、例えば、‘10'=>1,11=>2
3.後ろの配列は、前の配列の順序に基づいて並べ替えられます
4.前の配列等しい要素があれば後の配列を比較する
array_Multisort-複数の配列または多次元配列をソート
説明
bool array_multisort ( array $ar1 [, mixed $arg [, mixed $... [, array $... ]]] )
成功時にTRUEに戻るか、失敗時にFALSEに戻る.
array_Multisort()は、複数の配列を一度にソートしたり、ある次元または多次元に基づいて多次元配列をソートしたりするために使用できます.
関連付け(string)キー名は変更されませんが、数値キー名は再インデックスされます.
入力配列はテーブルの列として扱われ、行でソートされます.これはSQLのORDER BY句の機能に似ています.最初の配列は、ソートする主な配列です.配列内の行(値)が同じ場合は、次の入力配列の対応する値の大きさで並べ替えます.
この関数のパラメータ構造は尋常ではありませんが、非常に柔軟です.最初のパラメータは配列でなければなりません.次の各パラメータは、配列または以下に示すソートフラグであってもよい.
ソート順フラグ:
SORT_ASC-上昇順にソート
SORT_DESC-下降順にソート
ソート・タイプ・フラグ:
SORT_REGULAR-アイテムを通常の方法で比較
SORT_NUMERIC-アイテムを数値で比較
SORT_STRING-アイテムを文字列で比較
各配列の後に2つの同類のソートフラグを指定することはできません.配列ごとに指定されたソートフラグは、配列に対してのみ有効です.これまではデフォルトのSORT_ASCとSORT_REGULAR.
#1複数配列の並べ替え
 
  
$ar1 = array("10", 100, 100, "a");
$ar2 = array(1, 3, "2", 1);
array_multisort($ar1, $ar2);
var_dump($ar1);
var_dump($ar2);
?>

この例では、ソート後、最初の配列には「10」、「a」、100100が含まれます.2番目の配列には、1、1、2、3が含まれます.2番目の配列の項目順序は、1番目の配列の対応する項目(100および100)順序と完全に一致します.
 
  
array(4) {
[0]=> string(2) "10"
[1]=> string(1) "a"
[2]=> int(100)
[3]=> int(100)
}
array(4) {
[0]=> int(1)
[1]=> int(1)
[2]=> string(1) "2"
[3]=> int(3)
}

#2多次元配列の並べ替え
 
  
$ar = array (array ("10", 100, 100, "a"), array (1, 3, "2", 1));
array_multisort ($ar[0], SORT_ASC, SORT_STRING,
$ar[1], SORT_NUMERIC, SORT_DESC);
?>

この例では、ソート後、1番目の配列には10100100、「a」(文字列上昇ソートとして)、2番目の配列には1、3、「2」、1(数値降下ソートとして)が含まれます.
#3 Sorting multi-dimensional array
 
  
$ar = array(
array("10", 11, 100, 100, "a"),
array( 1, 2, "2", 3, 1)
);
array_multisort($ar[0], SORT_ASC, SORT_STRING,
$ar[1], SORT_NUMERIC, SORT_DESC);
var_dump($ar);
?>

この例では、ソート後、最初の配列は「10」、100100、11、「a」(文字列として昇順に並べられます).2番目の配列は、1、3、「2」、2、1(数字として降順に並べられます)を含みます.
 
  
array(2) {
[0]=> array(5) {
[0]=> string(2) "10"
[1]=> int(100)
[2]=> int(100)
[3]=> int(11)
[4]=> string(1) "a"
}
[1]=> array(5) {
[0]=> int(1)
[1]=> int(3)
[2]=> string(1) "2"
[3]=> int(2)
[4]=> int(1)
}
}

#4データベース結果のソート
この例のdata配列の各セルは、テーブルのローを表します.これは、典型的なデータベースレコードのデータセットです.
例のデータは次のとおりです.
volume | edition
-------+--------
67 | 2
86 | 1
85 | 6
98 | 2
86 | 6
67 | 7
データはすべてdataという配列に格納されます.これは通常、mysql_などのデータベースからループして取得される結果です.fetch_assoc().
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);
?>
この例ではvolumeを降順に並べ,editionを昇順に並べた.
行を含む配列ができましたがarray_Multisort()にはカラムを含む配列が必要であるため、以下のコードでカラムを取得し、ソートします.
//列のリスト取得
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}
//volume降順、edition昇順にデータを並べ替える
//$dataを最後のパラメータとして汎用キーでソート
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?>
データ・セットの順序が整いました.結果は次のとおりです.
volume | edition
-------+--------
98 | 2
86 | 1
86 | 6
85 | 6
67 | 2
67 | 7
Example#5大文字と小文字を区別しないソート
SORT_STRINGとSORT_REGULARは大文字と小文字を区別しており、大文字は小文字の前に並べられています.
大文字と小文字を区別しないソートを行うには、元の配列の小文字のコピーに従ってソートします.
 
  
$array = array('Alpha', 'atomic', 'Beta', 'bank');
$array_lowercase = array_map('strtolower', $array);

array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array);

print_r($array);
?>

以上のルーチンが出力します.
Array
(
[0] => Alpha
[1] => atomic
[2] => bank
[3] => Beta
)
【訳者注】この関数はかなり役に立ちます.理解に役立つように、次の例を見てください.
Example#6ランキング
 
  
$grade = array("score" => array(70, 95, 70.0, 60, "70"),
"name" => array("Zhang San", "Li Si", "Wang Wu",
"Zhao Liu", "Liu Qi"));
array_multisort($grade["score"], SORT_NUMERIC, SORT_DESC,
// ,
$grade["name"], SORT_STRING, SORT_ASC);
// ,
var_dump($grade);
?>

以上のルーチンが出力します.
array(2) {
["score"]=>
array(5) {
[0]=>
int(95)
[1]=>
string(2) "70"
[2]=>
float(70)
[3]=>
int(70)
[4]=>
int(60)
}
["name"]=>
array(5) {
[0]=>
string(5) "Li Si"
[1]=>
string(6) "Liu Qi"
[2]=>
string(7) "Wang Wu"
[3]=>
string(9) "Zhang San"
[4]=>
string(8) "Zhao Liu"
}
}
この例では,成績を含む配列$gradeをスコア(score)で上位から下位に並べ替え,スコアが同じ人は名前で並べ替える.(name)小さいから大きいまで並べ替えます.並べ替え後李四95は1位、趙六60は5位に分けて異議はありません.張三、王五、劉七は70点で、彼らの順位はその名前のアルファベット順で並べて、Liuは前で、Wangは後でZhangは最後です.区別するために、3つの70点はそれぞれ整数、浮動小数点数と文字列で表して、プログラムで負けることができます出力には、ソートの結果が明確に表示されます.