MENU

【PHP】配列の並べ替え・文字列変換・集計の関数を解説|Webの基礎

PHPの配列の並べ替え・文字列変換・集計の関数を解説|Webの基礎
目次

はじめに

前回の記事では、配列に要素を追加・削除したり、値を検索したりする関数について解説しました。

今回は配列の関数の続きとして、並べ替え、配列と文字列の変換、合計・最大・最小などの集計、一部の取り出し、重複の削除に使う関数を解説します。

配列を並べ替える(sort・rsort)

sort()は配列の要素を小さい順(昇順)に、rsort()は大きい順(降順)に並べ替える関数です。

<?php
    $prices = [300, 50, 1200, 480];

    sort($prices);
    print_r($prices); // 50, 300, 480, 1200

    rsort($prices);
    print_r($prices); // 1200, 480, 300, 50

sort()とrsort()は、前回の記事で紹介した「配列そのものを変更する」タイプの関数です。並べ替えた結果は、引数に渡した$prices自体に反映されます。

$sorted = sort($prices);のように書いても、$sortedには並べ替えた配列ではなくtrueが入ります。並べ替えた後は、元の変数($prices)をそのまま使ってください。

文字列の並び順

文字列を並べ替えると、文字コードの順番で並びます。アルファベットは大文字が小文字より先になり、日本語はひらがなならおおむね五十音順になりますが、漢字は読みの順番にはなりません。

<?php
    $cities = ["福岡", "東京", "大阪", "名古屋"];

    sort($cities);
    print_r($cities); // 名古屋, 大阪, 東京, 福岡

読みの順番(大阪→東京→名古屋→福岡)にはなっていません。漢字を読みの順番で並べたいときは、ふりがなを別に持たせて、そちらで並べ替えるのが一般的です。

連想配列を並べ替える(asort・arsort・ksort)

連想配列にsort()を使うと、キーが消えて0・1・2…の番号に置き換わってしまいます。

<?php
    $prices = ["ぶどう" => 300, "りんご" => 150, "みかん" => 100];

    sort($prices);
    print_r($prices); // [0] => 100, [1] => 150, [2] => 300(キーが消える)

連想配列では、キーと値の組み合わせを保ったまま並べ替える次の関数を使います。

関数並べ替えの基準順番
asort()値小さい順
arsort()値大きい順
ksort()キー小さい順
krsort()キー大きい順
<?php
    $prices = ["ぶどう" => 300, "りんご" => 150, "みかん" => 100];

    asort($prices);
    print_r($prices); // みかん => 100, りんご => 150, ぶどう => 300

    arsort($prices);
    print_r($prices); // ぶどう => 300, りんご => 150, みかん => 100

asort()の「a」は連想配列(associative array)、ksort()の「k」はキー(key)、rsort()などの「r」は逆順(reverse)の頭文字です。この3つを組み合わせて覚えると、関数名から動きが分かるようになります。

連想配列を並べ替えたときの違いを示した図。sortはキーが消えて0・1・2の番号になり、asortは値の小さい順にキーと値の組み合わせを保って並び、ksortはキーの順番で並ぶ

配列と文字列を変換する(implode・explode)

implode:配列を1つの文字列につなげる

implode()は、配列の要素を指定した区切り文字でつなげて、1つの文字列にする関数です。

<?php
    $colors = ["赤", "青", "黄"];

    echo implode("、", $colors); // 赤、青、黄
    echo implode(" / ", $colors); // 赤 / 青 / 黄

implode(区切り文字, 配列)の順番で書きます。配列の中身を画面に一覧表示したいときや、CSVのようにカンマ区切りの文字列を作りたいときに便利です。

explode:文字列を区切って配列にする

explode()は反対に、文字列を指定した区切り文字で分割して、配列にする関数です。

<?php
    $text = "東京,大阪,名古屋";

    $cities = explode(",", $text);

    print_r($cities); // [0] => 東京, [1] => 大阪, [2] => 名古屋

explode(区切り文字, 文字列)の順番で書きます。フォームにカンマ区切りで入力されたキーワードや、CSVファイルの1行を分解するときなどに使います。

区切り文字は、文字列の中の区切りと完全に一致している必要があります。"a, b"のようにカンマの後ろに空白がある文字列を","で分割すると、2つ目の要素は" b"(先頭に空白付き)になります。

合計・最大・最小を求める(array_sum・max・min)

数値の配列は、次の関数で集計できます。

<?php
    $scores = [80, 65, 92];

    echo array_sum($scores); // 237(合計)
    echo max($scores);       // 92(最大)
    echo min($scores);       // 65(最小)

    $average = array_sum($scores) / count($scores);
    echo round($average, 1); // 79(平均)

平均を求める関数はないため、array_sum()で求めた合計をcount()で求めた要素数で割ります。round(値, 1)は、小数第1位までに四捨五入する関数です(79.0の場合は「79」と表示されます)。

配列の記事の実務サンプルでは、for文で1つずつ足して合計を求めましたが、配列の値をそのまま合計するだけならarray_sum()の1行で済みます。

max()・min()に空の配列を渡すと、ValueErrorというエラーで処理が止まります。また、空の配列で平均を求めると0で割ることになりエラーになります。データが0件になる可能性があるときは、先にcount()で件数を確認しましょう。

配列の一部を取り出す(array_keys・array_slice)

array_keys:キーだけを取り出す

array_keys()は、配列のキーだけを並べた新しい配列を返します。値だけを取り出すarray_values()(前回の記事で紹介)と対になる関数です。

<?php
    $user = ["name" => "田中", "age" => 30, "city" => "東京"];

    print_r(array_keys($user));   // name, age, city
    print_r(array_values($user)); // 田中, 30, 東京

array_slice:指定した範囲を取り出す

array_slice()は、配列の指定した位置から、指定した数だけ要素を取り出した新しい配列を返します。

<?php
    $letters = ["A", "B", "C", "D", "E"];

    print_r(array_slice($letters, 0, 3)); // A, B, C(先頭から3つ)
    print_r(array_slice($letters, 1, 2)); // B, C(1番目から2つ)
    print_r(array_slice($letters, -2));   // D, E(最後から2つ)

array_slice(配列, 開始位置, 個数)の順番で書きます。開始位置は0から数え、マイナスの値を指定すると末尾から数えます。個数を省略すると、最後まで取り出します。「上位3件だけ表示する」「最新の5件だけ表示する」といった場面でよく使います。

重複を取り除く(array_unique)

array_unique()は、配列から重複している値を取り除いた新しい配列を返します。

<?php
    $prefs = ["東京", "大阪", "東京", "福岡", "大阪"];

    $unique = array_unique($prefs);
    print_r($unique); // [0] => 東京, [1] => 大阪, [3] => 福岡

同じ値が2つ以上あるときは、最初に出てきたものだけが残ります。ただし、インデックスは元のままなので、上の例では2が抜けています。0から振り直したいときは、前回紹介したarray_values()と組み合わせます。

<?php
    $prefs = ["東京", "大阪", "東京", "福岡", "大阪"];

    $unique = array_values(array_unique($prefs));
    print_r($unique); // [0] => 東京, [1] => 大阪, [2] => 福岡

今回の関数のまとめ

関数動き元の配列
sort()・rsort()値で並べ替える(キーは消える)変わる
asort()・arsort()キーを保って値で並べ替える変わる
ksort()・krsort()キーで並べ替える変わる
implode(区切り, 配列)配列をつなげた文字列を返す変わらない
explode(区切り, 文字列)文字列を分割した配列を返す―
array_sum()・max()・min()合計・最大・最小を返す変わらない
array_keys()キーだけの配列を返す変わらない
array_slice(配列, 開始, 個数)一部を取り出した配列を返す変わらない
array_unique()重複を取り除いた配列を返す変わらない

実務サンプル(テストの成績ランキングを作る)

名前と点数の連想配列から、上位3名のランキングと、全体の平均点・最高点・最低点を表示するサンプルです。

テストの成績ランキングの表示例。上位3名として鈴木95点・佐藤88点・伊藤88点が並び、その下に受験者5名、平均81.4点、最高95点、最低64点が表示される
<?php
    // 名前 => 点数(データベースから取得した想定)
    $scores = [
        "田中" => 72,
        "佐藤" => 88,
        "鈴木" => 95,
        "高橋" => 64,
        "伊藤" => 88,
    ];

    // ① 集計(並べ替えの前でも後でも結果は同じ)
    $count   = count($scores);
    $average = round(array_sum($scores) / $count, 1);
    $max     = max($scores);
    $min     = min($scores);

    // ② 点数の高い順に並べ替え、上位3名を取り出す
    arsort($scores);
    $top3 = array_slice($scores, 0, 3);
?>
<h2>成績ランキング(上位3名)</h2>
<ol>
    <?php foreach ($top3 as $name => $score): ?>
        <li><?php echo $name; ?>さん:<?php echo $score; ?>点</li>
    <?php endforeach; ?>
</ol>
<p>
    受験者<?php echo $count; ?>名 / 平均<?php echo $average; ?>点 /
    最高<?php echo $max; ?>点 / 最低<?php echo $min; ?>点
</p>

ブラウザには次のように表示されます。

成績ランキング(上位3名)
1. 鈴木さん:95点
2. 佐藤さん:88点
3. 伊藤さん:88点

受験者5名 / 平均81.4点 / 最高95点 / 最低64点

ポイントは次のとおりです。

  • 名前(キー)と点数(値)の組み合わせを保ちたいので、sort()ではなくarsort()で並べ替えています
  • array_slice()は、連想配列の文字列のキーをそのまま残して取り出すため、foreachで名前と点数を一緒に表示できます
  • 同じ点数(佐藤さんと伊藤さん)は、元の配列の順番のまま並びます

よくある質問・エラー対処

Q. sortで並べ替えた結果を変数に入れたら「1」と表示されます

→ sort()は元の配列そのものを並べ替え、戻り値としては成功を表すtrue(表示すると「1」)を返します。$結果 = sort($配列);ではなく、sort($配列);の後に$配列を使ってください。


Q. 連想配列を並べ替えたら、キーが0・1・2になってしまいました

→ sort()やrsort()はキーを保持しません。連想配列を値で並べ替えるときはasort()・arsort()、キーで並べ替えるときはksort()・krsort()を使ってください。


Q. max(): Argument #1 ($value) must contain at least one elementというエラーが出ます

→ max()やmin()に空の配列を渡しています。if (count($配列) > 0)のように、要素があるときだけ実行してください。


Q. 空の文字列をexplodeしたら、要素が1つの配列になりました

→ explode(",", "")は、空文字列が1つ入った配列(要素数1)を返します。入力が空の可能性があるときは、先にif ($文字列 !== "")で空かどうかを確認してから分割してください。

おわりに(まとめ)

まとめ

配列の関数を使うと、並べ替えや集計、文字列との変換を短く書けます。

  • ✅ sort・rsortは値で並べ替える(連想配列ではキーが消える)
  • ✅ 連想配列はasort・arsort(値)、ksort・krsort(キー)で並べ替える
  • ✅ implodeは配列を文字列に、explodeは文字列を配列に変換する
  • ✅ array_sum・max・minで合計・最大・最小を求められる
  • ✅ array_sliceで範囲を取り出し、array_uniqueで重複を取り除ける

次回は、決まった処理をまとめて名前を付け、何度も呼び出せるようにする「関数の作り方」について解説します。

次回は、よく使う処理に名前を付けてまとめ、何度でも呼び出せるようにする「関数」の作り方について解説予定です。

この記事が、少しでも誰かのお役に立てれば幸いです。

関連記事

当サイトの記事で使用したVBAなどのサンプルをDLできます

この記事のサンプルはありません!

ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!


【CSS】テキスト関連プロパティについて基本解説|Webの基礎


よかったらシェアしてね!
  • URLをコピーしました!
目次