こんにちは!
近所のいつものカフェでご満悦してるちょこひです。

今日突然暑くなった!
朝からルンルンで洗濯回せるのはいいけども
暑いのだいっきらいなんでやめてほしい!


アカン

今日はPHPのsort関数について書きます。
夏休み明けたらすぐ定期テストがあるため最近重い腰を上げて
ようやっと勉強し始めたんですが

昨日見事にソート関連でハマりました。

ググりにググりまくり
友達に確認してなんとかなったので
書き留めておきます。


今日使うもの


さて、sort関数の話をする前にソートされるものを用意しましょう。
今回は2つ用意します。
 
$array = array('かきくけこ', 'さしすせそ', 'あいうえお');
$dict = array('chocolate' => 'チョコレート', 'apple' => 'リンゴ', 'banana' => 'バナナ');

$arrayはよくみる配列です。
Javaと同じように、0から順にインデックスが振られます。
要素数3つの配列です。

$dictは「連想配列」です。要素とキーがセットになったもの。
Swiftでは辞書って呼ばれるものです。 


では、ソート関数のお話。
PHPには、いろんなソート関数が用意されています。

・sort
・rsort
・ksort
・krsort
・asort
・arsort

今回はこれらの整理です。 


普通の配列の場合

 まずは普通の配列をソートする場合についてまとめます。

 
$array = array('かきくけこ', 'さしすせそ', 'あいうえお');
$result = sort($array);
print_r($array);


実行結果が以下です。

Array
(
    [0] => あいうえお
    [1] => かきくけこ
    [2] => さしすせそ
)

sort関数は、要素を昇順でソートし、インデックスを振りなおします
戻り値はboolean。成功時にtrue、失敗時にfalseが入ります。
ここでは$resultにはtrueが入っています。


では、rsort関数は
$array = array('かきくけこ', 'さしすせそ', 'あいうえお');
$result = rsort($array);
print_r($array);
 
実行結果が以下です。

Array
(
    [0] => さしすせそ
    [1] => かきくけこ
    [2] => あいうえお
)

rsort関数は、要素を降順でソートし、インデックスを振り直します
sort関数同様、戻り値はbooleanです。


続いてksort関数。
$array = array('かきくけこ', 'さしすせそ', 'あいうえお');
$result = ksort($array);
print_r($array);
 
 
実行結果が以下です。

Array
(
    [0] => かきくけこ
    [1] => さしすせそ
    [2] => あいうえお
)

ksortのkは、「key」の略です。キーを昇順に並べ替えて配列を作成します
ここではkeyは自動で振られたインデックス順なので、実行前と結果が変わりません。

ここまでくればわかるかと思いますが、
krsortは
$array = array('かきくけこ', 'さしすせそ', 'あいうえお');
$result = krsort($array);
print_r($array);

実行結果は

Array
(
    [2] => あいうえお
    [1] => さしすせそ
    [0] => かきくけこ
)
こうなります。

では、asort。

$array = array('かきくけこ', 'さしすせそ', 'あいうえお');
$result = asort($array);
print_r($array);
 

実行結果は

Array
(
    [2] => あいうえお
    [0] => かきくけこ
    [1] => さしすせそ
)

asortはsortと違い、
キーと値のセットを維持したまま要素の昇順で並べ替えます
asortは連想配列でやると違いがよくわかるので、連想配列で同じことをしてみます。


連想配列の場合

では、連想配列で同じことをしてみます。
まずはsortから。
$dict = array('chocolate' => 'チョコレート', 'apple' => 'リンゴ', 'banana' => 'バナナ');
$result = sort($dict);
print_r($dict);

実行結果
Array
(
    [0] => チョコレート
    [1] => バナナ
    [2] => リンゴ
)

キーがどっかいきました。

同じように、ksortでも試してみましょう。

$dict = array('chocolate' => 'チョコレート', 'apple' => 'リンゴ', 'banana' => 'バナナ');
$result = ksort($dict);
print_r($dict);

実行結果は

Array
(
    [apple] => リンゴ
    [banana] => バナナ
    [chocolate] => チョコレート
)
キーと値の関係を維持しながらキーの昇順に並べ替えられ、再度インデックスが追加されています。

では、asortは
 
$dict = array('chocolate' => 'チョコレート', 'apple' => 'リンゴ', 'banana' => 'バナナ');
$result = asort($dict);
print_r($dict);

実行結果は

Array
(
    [chocolate] => チョコレート
    [banana] => バナナ
    [apple] => リンゴ
)

キーと値を維持したまま、要素の昇順で再度インデックスが振られています。

連想配列を要素の昇順/降順でソートしたい時、
sort / rsort関数を使ってしまうとキーが失われてしまいます。

困っちゃう。

そんな時に一役買うのがasort / arsort関数ってな感じです。
 
まとめ


エラい硬くなりましたが、こんな感じ。
最初普通にsort関数を使ってキーがどっかいっちゃって、
Σ(゚д゚;) こうなってました。

にしてもややこしいなあ!
PHPはややこしいです。

Javaのありがたみをかみしめながら引き続き勉強します!



ちょこひ