PHPの配列のソートがわかる!usortや他のソート方法解説

こんにちは!独学プログラマー&ライターのつぶらやです。

PHPでデータを配列に入れたのはいいけど並び方がバラバラ
並び方も、昇順降順ではなくもっと複雑に並び替えたい[su_spacer size=”20″]

そんな時に有効な関数がusortなどのsort関数です。

本日は以下の内容でお話していきます。

usortで並び替え
キーを変えずに並び替える(uasort関数)
キーで並び替える(uksort関数)

目次

usortで並び替え

usortはコールバック関数です。

関数の引数に、別の関数を指定します。

そして、指定した別の関数の結果で比較をする事で並び替えが実現します。

一次元配列ではない、多次元配列の並び替えの時に使用します。

サンプルコードで実際の動きを見ていきましょう。

コメントの数字は後で解説する箇所です。

<?php
function sort_test($right, $left){ // ②

    return strcmp($right["sports"], $left["sports"]); // ③
}

$sports[0]['sports'] = 'tennis';
$sports[1]['sports'] = 'baseball';
$sports[2]['sports'] = 'swimming';

usort($sports, "sort_test"); // ①

echo "<pre>";
print_r($sports);
echo "</pre>";
?>

[su_spacer size=”20″]

結果
Array
(
    [0] => Array
        (
            [sports] => baseball
        )

    [1] => Array
        (
            [sports] => swimming
        )

    [2] => Array
        (
            [sports] => tennis
        )

)

[su_spacer size=”20″]

tennis→tennis→swimming となっていた配列が、baseball→swimming→tennis と並び替わりました。

プログラムの流れは、

並び替えたいデータを配列に入れる

usortで関数を呼ぶ

関数で比較をして並び替えを行う

という流れです。

それではコードの解説をしていきます。

①usortで関数を呼ぶ[su_spacer size=”20″]

第一引数に並び替えたい配列、第二引数に関数名を指定します。

②呼んだ関数に引数を設定する[su_spacer size=”20″]

$rightと$leftという変数を設定していますが、これは何でしょうか。

どこにも出てきていませんね。

実は、この第一、第二引数の変数の名称は何でも構わないのです。

この中には、自動的に比較する配列のデータが入ってきます。

③strcmpで比較[su_spacer size=”20″]

strcmpはPHPの比較の関数です。

以下のように比較結果で返る値が違います。

第一引数 < 第二引数の時、負の整数を返す
第一引数 > 第二引数の時、正の整数を返す
第一引数 = 第二引数の時、0を返す

usortで呼んだ関数の戻り値は、負の整数か正の整数か0である必要があります。

ところで、usortでの並び替えの結果は配列のキーも並び替えによって変わってしまっていました。

次章から、

・キーが変わらないように並び替える
・キーで並び替える

を実現するためのusortの関連の関数について解説していきます。

キーを変えずに並び替える(uasort関数)

配列のキーが変わらないように並び替えるuasort関数です。

usortのサンプルコードを少しだけ変更して結果を見てみます。

<?php
function sort_test($right, $left){

    return strcmp($right["sports"], $left["sports"]);
}

$sports[0]['sports'] = 'tennis';
$sports[1]['sports'] = 'baseball';
$sports[2]['sports'] = 'swimming';

usort($sports, "sort_test"); // usortをuasortに変更

echo "<pre>";
print_r($sports);
echo "</pre>";
?>

[su_spacer size=”20″]

結果
Array
(
    [1] => Array
        (
            [sports] => baseball
        )

    [2] => Array
        (
            [sports] => swimming
        )

    [0] => Array
        (
            [sports] => tennis
        )

)

[su_spacer size=”20″]

比較した値の順番は並び替わりました。

そして配列のキーも元の値のままです。

配列のキーを変えたくないな場合に使いましょう。

キーで並び替える(uksort関数)

続いて、キーで並び替える関数、uksort関数の紹介です。

同じようにusortのサンプルコードを少し変更して結果を見てみます。

<?php
function sort_test($right, $left){

    return strcmp($right, $left); // キーのみ渡ってくるので記述を変更
}

$sports[6]['sports'] = 'tennis';
$sports[4]['sports'] = 'baseball';
$sports[0]['sports'] = 'swimming';

uksort($sports, "sort_test"); // usortをuksortに変更

echo "<pre>";
print_r($sports);
echo "</pre>";
?>

[su_spacer size=”20″]

結果
Array
(
    [0] => Array
        (
            [sports] => swimming
        )

    [4] => Array
        (
            [sports] => baseball
        )

    [6] => Array
        (
            [sports] => tennis
        )

)

[su_spacer size=”20″]

キー名で配列を並び替えることが出来ました。

まとめ

本日はPHPのusortについて解説しました。

配列の複雑な並び替えは少し理解するのが難しいかもしれません。

サンプルコードを実際に動かして理解を深めてください。

それでは、また。

この記事を書いた人

独学PG&SE、東京在住30代女性。
誰でもプログラマーになれるがモットーで、わかりやすい記事を目指しています。

目次