ホームページ > バックエンド開発 > PHPチュートリアル > PHP の usort() 関数が不安定なソートである場合はどうすればよいですか?

PHP の usort() 関数が不安定なソートである場合はどうすればよいですか?

WBOY
リリース: 2016-06-20 12:28:46
オリジナル
1741 人が閲覧しました

プロジェクトには要件があります
データのセットは、最初にパラメーター 1 で並べ替える必要があります。パラメーター 1 が同じ場合は、パラメーター 2 で並べ替えます。
usort が安定した並べ替えである場合は、usort を直接使用してパラメーター 2 に従って配列を並べ替えてから、並べ替えられた配列をパラメーター 1 に従って並べ替えます。
しかし、テストした結果、usort は不安定なソートであることが判明しました。どうすればよいでしょうか?
コードは次のとおりです:

<?php$a1 = array('key1'=>1,'key2'=>1);$a2 = array('key1'=>2,'key2'=>2);$a3 = array('key1'=>2,'key2'=>3);$a = array($a3,$a2,$a1);usort($a,"my_sort2");print_r($a);usort($a,"my_sort1");print_r($a);function my_sort1($a,$b){if ($a['key1']==$b['key1']) return 0;return ($a['key1']<$b['key1'])?-1:1;}function my_sort2($a,$b){if ($a['key2']==$b['key2']) return 0;return ($a['key2']<$b['key2'])?-1:1;}?>
ログイン後にコピー

出力は次のとおりです:
Array(    [0] => Array        (            [key1] => 1            [key2] => 1        )    [1] => Array        (            [key1] => 2            [key2] => 2        )    [2] => Array        (            [key1] => 2            [key2] => 3        ))Array(    [0] => Array        (            [key1] => 1            [key2] => 1        )    [1] => Array        (            [key1] => 2            [key2] => 3        )    [2] => Array        (            [key1] => 2            [key2] => 2        ))
ログイン後にコピー

この場合、挿入ソートなどの安定したソート アルゴリズムしか記述できませんか?


ディスカッションへの返信 (解決策)

$a1 = array('key1'=>1,'key2'=>1);$a2 = array('key1'=>2,'key2'=>2);$a3 = array('key1'=>2,'key2'=>3);$a = array($a3,$a2,$a1);foreach($a as $v) {  $r2[] = $v['key2'];  $r1[] = $v['key1'];}array_multisort($r1,$r1, $a);print_r($a);
ログイン後にコピー
Array(    [0] => Array        (            [key1] => 1            [key2] => 1        )    [1] => Array        (            [key1] => 2            [key2] => 2        )    [2] => Array        (            [key1] => 2            [key2] => 3        ))
ログイン後にコピー

多次元配列のソートは、この array_multisort を使用します
http://php.net/manual/zh/function.array-multisort.php

<?php$a1 = array('key1'=>1,'key2'=>1);$a2 = array('key1'=>2,'key2'=>2);$a3 = array('key1'=>2,'key2'=>3);$a = array($a3,$a2,$a1);foreach($a as $v){     $ar1[] = $v['key1'];     $ar2[] = $v['key2'];}array_multisort($ar1,SORT_ASC,$ar2,SORT_ASC, $a);print_r($a);?>
ログイン後にコピー



配列
(
[0] => > )

[1] => 配列
(
[key1] => 2
[key2] => 2
) >
[2] = > 配列
( 🎜>ご指導ありがとうございます @xuzuning @奥雪星峰

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