PHPのarray_multisort()関数使用上の注意

高洛峰
リリース: 2023-03-04 16:56:02
オリジナル
1222 人が閲覧しました

関数 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 と比較すると、他の 3 つの数値より小さい整数 10 に変換されます
# '10' は、'a' と比較する場合、文字列として使用され、その最初の文字は '1' ASCII コードです 値 49 は 'a' (ASCII 値は 97) より小さいため、'10' が最小の要素です
# 他の 3 つの数値が比較されると、'a' は整数 0 に変換されます他の 3 つの数値
$arr2
Array ( [0] => 1 [1] => 5 [2] => 2 [3] => 2 [4] => 3 より小さい)
# $arr2 要素 1 と $arr1 要素 '10' の位置が対応しているため、位置 [0] にランク付けされます
# $arr1[2] => 100, $arr1[3] => 100 は $arr2 要素に対応しますそれぞれ「3」、「2」。 3 は '2' より大きいので、2 に対応する $arr1[2] => 100 のソートされた添字は
3 で、3 に対応する $arr1[3] => 100 のソートされた添字は 4 になります。ソートに参加する配列要素の数は変わりません
2。ソートされた配列要素の位置は、たとえば '10' => 1、11 => 2 に対応します。前の配列の順序に基づいて
4. 前の配列が等しい要素に遭遇した場合、後の配列を比較します

array_multisort — 複数の配列または多次元配列を並べ替えます

説明
bool array_multisort ( array $ar1 [,mixed $arg [,mixed $.. . [, array $... ]]] )
成功した場合は TRUE を返し、失敗した場合は FALSE を返します。

array_multisort() は、複数の配列を一度に並べ替えたり、複数の配列を並べ替えたりするために使用できます。特定の次元または複数の次元に従って配列がソートされます。

関連付けられた (文字列) キー名は変更されませんが、数値キー名は再インデックスされます。

入力配列はテーブルの列として扱われ、行ごとに並べ替えられます。これは SQL の ORDER BY 句の機能と似ています。最初の配列は、ソートされるメインの配列です。配列内の行 (値) が同じであると比較された場合、次の入力配列内の対応する値のサイズに従って並べ替えられます。

この関数のパラメータ構造はやや特殊ですが、非常に柔軟です。最初のパラメータは配列である必要があります。次の各引数には、以下にリストされている配列または並べ替えフラグを指定できます。

ソート順序フラグ:

SORT_ASC - 昇順でソート
SORT_DESC - 降順でソート

ソートタイプフラグ:

SORT_REGULAR - 通常の方法で項目を比較
SORT_NUMERIC - 項目を番号順で比較
SORT_STRING - 項目を比較番号順 文字列比較に従って

各配列の後に 2 つの同様の並べ替えフラグを指定することはできません。各配列の後に指定されたソート フラグは、その配列に対してのみ有効です。その前は、デフォルト値 SORT_ASC および SORT_REGULAR です。

#1 複数の配列を並べ替える

<?php 
$ar1 = array("10", 100, 100, "a"); 
$ar2 = array(1, 3, "2", 1); 
array_multisort($ar1, $ar2); 
var_dump($ar1); 
var_dump($ar2); 
?>
ログイン後にコピー

この例で並べ替えると、最初の配列には "10"、"a"、100、100 が含まれます。 2 番目の配列には 1,1,"2",3 が含まれます。 2 番目の配列内の項目の順序は、最初の配列内の対応する項目 (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 多次元配列の並べ替え

<?php 
$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); 
?>
ログイン後にコピー

この例で並べ替えると、最初の配列には 10、100、100、"a" (文字列の昇順で並べ替え) が含まれ、2 番目の配列には 1、3 が含まれます。 、「2」、1 (数値の降順)。

#3 多次元配列のソート

<?php 
$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」、100、100、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 都是区分大小写字母的,大写字母会排在小写字母之前。

要进行不区分大小写的排序,就要按照原数组的小写字母拷贝来排序。

<?php 
$array = array(&#39;Alpha&#39;, &#39;atomic&#39;, &#39;Beta&#39;, &#39;bank&#39;); 
$array_lowercase = array_map(&#39;strtolower&#39;, $array); 

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

print_r($array); 
?>
ログイン後にコピー

以上例程会输出:

Array
(
[0] => Alpha
[1] => atomic
[2] => bank
[3] => Beta
)

【译者注】本函数相当有用,为有助于理解,请再看下面这个例子:


Example #6 名次排列

<?php 
$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 分为第一名,赵六 60 分为第五名没有异议。张三、王五和刘七都是 70 分,他们的名次则由其姓名的字母顺序排列,Liu 在前,Wang 在后而 Zhang 在最后。为了区别,三个 70 分分别用了整数,浮点数和字符串来表示,可以在程序输出中清楚地看到它们排序的结果。

更多PHP array_multisort()函数的使用札记相关文章请关注PHP中文网!

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート