web-dev-qa-db-ja.com

PHPではusort()関数はどのように機能しますか

私はphpのドキュメント、オンラインのチュートリアルを見てきましたが、usortが実際にどのように機能しているかはわかりません。下で遊んでいた例があります。

$data = array(

    array('msg' => 'some text','month' => 11,'level' => 10),

    array('msg' => 'some text','month' => 5,'level' => 10),

    array('msg' => 'some text','month' => 8,'level' => 10),

    array('msg' => 'some text','month' => 12,'level' => 10),

    array('msg' => 'some text','month' => 2,'level' => 10),

    array('msg' => 'some text','month' => 3,'level' => 10),

    array('msg' => 'some text','month' => 4,'level' => 10),

    array('msg' => 'some text','month' => 7,'level' => 10),

    array('msg' => 'some text','month' => 10,'level' => 10),

    array('msg' => 'some text','month' => 1,'level' => 10),

    array('msg' => 'some text','month' => 6,'level' => 10),

    array('msg' => 'some text','month' => 9,'level' => 10)

);

私は、いくつかの助けを通して12か月から1か月に(それらが整理されていないため)ソートできるようにしたかったのです。これが解決策でした

function cmp($a, $b)
{
    if ($a["month"] == $b["month"]) 
    {
       return 0;
    }
    return ($a["month"] < $b["month"]) ? -1 : 1;
}

usort($data, "cmp");

しかし、私は関数cmpが配列をソートする方法を理解していません。私はこのように各変数$ aと$ bを出力してみました:

function cmp($a, $b)
{
   echo "a: ".$a['month']."<br/>";
   echo " b: ".$b['month']."<br/>";
   echo "<br/><br/>";
}

そして出力は

a: 3
b: 5

a: 9
b: 3

a: 3
b: 8

a: 6
b: 3

a: 3
b: 12

a: 1
b: 3

a: 3
b: 2

a: 10
b: 3

a: 3
b: 11

a: 7
b: 3

a: 4
b: 3

a: 12
b: 2

a: 5
b: 12

a: 12
b: 11

a: 8
b: 12

a: 5
b: 8

a: 2
b: 11

a: 6
b: 9

a: 7
b: 6

a: 6
b: 4

a: 10
b: 6

a: 1
b: 6

a: 9
b: 4

a: 7
b: 1

a: 10
b: 7

並べ替えの仕組みやcmp($ a、$ b)が使用される理由はわかりません。あなたが見ることができるように私はすべてのプロセスを印刷しようとしましたが、それがどのように機能するかについての解決策には至っていません。

ありがとう

23
Sarmen B.

関数cmp自体はソートを行いません。値が別の値より小さい、等しい、または大きいかどうかをusortに通知するだけです。例えば。 $a = 5$b = 9の場合、1を返し、$bの値が$aの値より大きいことを示します。

並べ替えはusortによって行われます。

28
halfdan

PHPのソート関数に提供されるコールバックには、3つの戻り値があります:

0:  both elements are the same
-1 (<0): the first element is smaller than the second
1 (>0):  the first element is greater

現在、usortはおそらく内部で何らかのクイックソートまたはマージソートを使用しています。比較ごとに、2つの要素を使用してコールバックを呼び出し、それらを交換する必要があるかどうかを判断します。

24
knittl

sort() は、配列をソートするために Quicksort の実装を使用し、cmp関数を必要な回数だけ呼び出して、配列を完全にソートします。そのアルゴリズム。

10
Paul

他の人が述べたように、usortはQuicksortアルゴリズムを使用します。余談ですが、2つの文字列を明示的に比較する必要はありません。 PHPの文字列比較メソッドを使用できます。

あなたが作成した関数、

function cmp($a, $b)
{
    if ($a["month"] == $b["month"]) 
    {
       return 0;
    }
    return ($a["month"] < $b["month"]) ? -1 : 1;
}

単に次のように書くことができます

function compareMyStrings($a, $b){
    return strnatcmp($a["month"], $b["month"]);
}

お役に立てれば!

4
pat