ホームページ  >  記事  >  バックエンド開発  >  Array_multisort 多次元配列のソート使用の完全なソリューション

Array_multisort 多次元配列のソート使用の完全なソリューション

高洛峰
高洛峰オリジナル
2016-10-20 14:52:401394ブラウズ

1. まず最も単純な状況を見てみましょう。 2 つの配列があります:

$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

2 つの配列の値は最初から最後まで対応していると推定します。1 は 6 に、9 は 2 に、5 は 4 に対応します。

配列をもう 1 つ追加して、何が起こるか見てみましょう:

$arr1 = array(1,9,5);
$arr2 = array(6,2,4);
$arr3 = array(3,7,8);
array_multisort($arr1,$arr2,$arr3);

結果を見ると、最初から最後まで 1 は 6 と 3 に対応しており、他の項目についても同様です。この対応は、マニュアルでは「ソート中に元のキー名の関連付けを保持する」と呼ばれるものです。

また、各配列をデータベーステーブルの列として考えることもできます。対応する 1、6、3 は 1 つのデータ行であり、9、2、7 は別のデータ行です。 。 。

array_multisort は、まず最初の配列(列として想像してください)でソートし、最初の配列(列)の値が同じであれば、2番目の配列(列)でソートします。

具体的には、次のプログラムを使用してテストできます:

$arr1 = array(1,9,5,9);
$arr2 = array(6,2,4,1);
$arr3 = array(3,7,8,0);
array_multisort($arr1,$arr2,$arr3);

出力:

Array ( [0] => 1 [1] => 5 [2] => 9 [3] => 9 ) 
Array ( [0] => 6 [1] => 4 [2] => 1 [3] => 2 ) 
Array ( [0] => 3 [1] => 8 [2] => 0 [3] => 7 )

ここで、$arr1 が通常どおり昇順にソートされていることがわかります。ただし、$arr2 と $arr3 はソートされません。

しかし、よく見てみると、これら 3 つの配列の各要素は、実際には 1 対 1 に対応していることがわかりました。


2. 次にarray_multisortのパラメータについて説明します。この関数のパラメータは非常に柔軟です。最も単純なケースは、上記のように 1 または n 個の配列をパラメーターとして使用することです。各配列内の項目の数が同じである必要があることに注意してください。そうでない場合は、警告が表示されて並べ替えが失敗します。

このように array_multisort($arr1,$arr2,$arr3); デフォルトでは、すべての配列が昇順でソートされ、$arr2 を降順でソートして文字列として比較する場合は、次のように記述する必要があります。

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

各配列の後にソート順序フラグまたはソート タイプ フラグを続けることができ、または両方のフラグを同時に表示することもできます。ただし、各配列の後に指定できるのは、各タイプのソート フラグ 1 つだけです。

詳細は次のとおりです:

ソート順序フラグ:

SORT_ASC - 昇順でソート(デフォルト)

SORT_DESC - 降順でソート

ソートタイプフラグ:

SORT_REGULAR - 通常の方法で項目を比較します(デフォルト) )

SORT_NUMERIC - 数値に基づいて項目を比較します

SORT_STRING - 文字列に基づいて項目を比較します

3. 最後に、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 の順序に従ってさらに 2 つの配列を作成する必要があります:

$scores = array(80,70,80,20);
$names = array('jake','jin','john','ben');

それから

array_multisort($scores, SORT_DESC, $names, $guys);

以上です

並べ替えるたびに、もっと柔軟にできますか?やらなければなりません 他の配列を取得しますか?

実際、これは qeephp の helper_array クラスにうまくカプセル化されています。必要な方は、次の 2 つのメソッドを自分で変更できます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。