私は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)が使用される理由はわかりません。あなたが見ることができるように私はすべてのプロセスを印刷しようとしましたが、それがどのように機能するかについての解決策には至っていません。
ありがとう
関数cmp
自体はソートを行いません。値が別の値より小さい、等しい、または大きいかどうかをusort
に通知するだけです。例えば。 $a = 5
と$b = 9
の場合、1を返し、$b
の値が$a
の値より大きいことを示します。
並べ替えはusort
によって行われます。
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つの要素を使用してコールバックを呼び出し、それらを交換する必要があるかどうかを判断します。
他の人が述べたように、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"]);
}
お役に立てれば!