MENU

【PHP】配列の要素を追加・削除・検索する関数を解説|Webの基礎

PHPの配列の要素を追加・削除・検索する関数を解説|Webの基礎
目次

はじめに

前回の記事では、foreach文で配列の要素を1つずつ取り出す方法と、break・continueについて解説しました。

PHPには、配列を操作するための関数がたくさん用意されています。今回はその中から、要素の追加・削除と値の検索に使う関数を解説します。並べ替えや結合・変換に使う関数は、次回の記事で解説します。

配列の関数の2つのタイプ

配列の関数は、大きく分けて次の2つのタイプがあります。

タイプ例動き
配列そのものを変更するarray_push()・array_pop()引数に渡した配列の中身が変わる
結果を戻り値で返すarray_merge()・in_array()元の配列は変わらず、結果を新しい値として返す

戻り値とは、関数が処理した結果として返してくる値のことです。戻り値で返すタイプは、$result = array_merge(…);のように変数で受け取らないと結果が失われる点に注意しましょう。

末尾・先頭に要素を追加する

array_push:末尾に追加する

array_push()は、配列の末尾に要素を追加する関数です。一度に複数の要素を追加できます。

<?php
    $fruits = ["りんご", "みかん"];

    array_push($fruits, "ぶどう", "もも");

    print_r($fruits); // りんご, みかん, ぶどう, もも

要素を1つだけ追加するなら、配列の記事で解説した$fruits[] = "ぶどう";と書く方が短く、よく使われます。

array_unshift:先頭に追加する

array_unshift()は、配列の先頭に要素を追加する関数です。元からあった要素のインデックスは、1つずつ後ろにずれます。

<?php
    $fruits = ["りんご", "みかん"];

    array_unshift($fruits, "いちご");

    print_r($fruits); // いちご, りんご, みかん

末尾・先頭の要素を取り出す

array_pop:末尾の要素を取り出す

array_pop()は、配列の末尾の要素を取り出して、配列から削除する関数です。取り出した要素は戻り値として受け取れます。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    $last = array_pop($fruits);

    echo $last;      // ぶどう
    print_r($fruits); // りんご, みかん

array_shift:先頭の要素を取り出す

array_shift()は、配列の先頭の要素を取り出して、配列から削除する関数です。残った要素のインデックスは、0から振り直されます。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    $first = array_shift($fruits);

    echo $first;      // りんご
    print_r($fruits); // みかん, ぶどう

ここまでの4つの関数は、「先頭か末尾か」「追加か取り出しか」の組み合わせで覚えると整理しやすくなります。

array_push・array_pop・array_unshift・array_shiftの4つの関数の動きを示した図。配列の末尾に対してarray_pushで追加・array_popで取り出し、先頭に対してarray_unshiftで追加・array_shiftで取り出す

空の配列にarray_pop()やarray_shift()を使うと、エラーにはならずnullが返ります。

指定した要素を削除する(unset)

途中の要素を削除したいときは、unset()を使います。unset(配列[インデックス])のように、削除したい要素を指定します。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    unset($fruits[1]); // みかんを削除

    print_r($fruits);

実行結果は次のとおりです。

Array
(
    [0] => りんご
    [2] => ぶどう
)

「みかん」は削除されましたが、インデックスは振り直されず、1が抜けたままになっています。この状態でfor文を使って$fruits[1]を取り出そうとすると、Undefined array key 1の警告が出てしまいます。

インデックスを0から振り直したいときは、array_values()を使います。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    unset($fruits[1]);
    $fruits = array_values($fruits); // インデックスを振り直す

    print_r($fruits); // [0] => りんご, [1] => ぶどう

array_values()は結果を戻り値で返すタイプの関数なので、$fruits = array_values($fruits);のように変数に代入し直します。

unsetで配列の途中の要素を削除すると、インデックス1が抜けたまま残り、array_valuesを使うとインデックスが0・1に振り直される様子を示した図

連想配列でもunset($user["email"]);のようにキーを指定して削除できます。番号で管理していないため、隙間を気にする必要はありません。

配列を結合する(array_merge)

array_merge()は、複数の配列を1つにつなげた新しい配列を返す関数です。

<?php
    $fruits     = ["りんご", "みかん"];
    $vegetables = ["にんじん", "トマト"];

    $foods = array_merge($fruits, $vegetables);

    print_r($foods); // りんご, みかん, にんじん, トマト

連想配列を結合した場合、同じキーがあると後ろの配列の値で上書きされます。

<?php
    $default = ["color" => "白", "size" => "M"];
    $order   = ["size" => "L", "count" => 2];

    $result = array_merge($default, $order);

    print_r($result); // color => 白, size => L, count => 2

この性質を使うと、「初期値に、指定された値だけを上書きする」処理を簡単に書けます。

値が含まれているか調べる(in_array)

in_array()は、配列の中に指定した値があるかどうかを調べる関数です。見つかればtrue、見つからなければfalseを返すため、if文の条件にそのまま使えます。

<?php
    $holidays = ["土", "日"];
    $today    = "日";

    if (in_array($today, $holidays)) {
        echo "今日は定休日です";
    } else {
        echo "今日は営業日です";
    }
    // 今日は定休日です

in_array(探す値, 配列)のように、探す値が先、配列が後の順番で書く点に注意してください。

型まで比べるには第3引数にtrueを指定する

in_array()は、初期設定では演算子の記事で解説した==と同じ、型を変換する比較で値を探します。そのため、文字列の"10"で探しても、数値の10が見つかります。

<?php
    $numbers = [10, 20, 30];

    var_dump(in_array("10", $numbers));       // bool(true)
    var_dump(in_array("10", $numbers, true)); // bool(false)

第3引数にtrueを指定すると、===と同じく型まで一致するものだけを探します。フォームから届いた値(文字列)と数値を比べる場面などで、意図しない一致を防ぎたいときに使います。

値の位置(キー)を調べる(array_search)

array_search()は、指定した値が配列のどこにあるかを調べ、見つかった要素のキー(インデックス)を返す関数です。見つからなかった場合はfalseを返します。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    var_dump(array_search("みかん", $fruits)); // int(1)
    var_dump(array_search("バナナ", $fruits)); // bool(false)

見つかったかどうかは「=== false」で判定する

array_search()で特に注意したいのが、先頭の要素が見つかったときに0が返る点です。次のように書くと、正しく判定できません。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    $index = array_search("りんご", $fruits); // 0 が返る

    if ($index) {
        echo "見つかりました";
    } else {
        echo "見つかりません"; // こちらが表示されてしまう
    }

ifの条件では、0はfalseと同じ扱いになるためです。見つかったかどうかは、=== false(型まで比較)で判定します。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    $index = array_search("りんご", $fruits);

    if ($index === false) {
        echo "見つかりません";
    } else {
        echo "{$index}番目に見つかりました"; // 0番目に見つかりました
    }
array_searchの戻り値の判定を示した図。先頭の要素が見つかると0が返り、if ($index)では0がfalse扱いになって「見つからない」と誤判定されるが、$index === falseで判定すれば0とfalseを正しく区別できる

「あるかないか」だけ知りたいときはin_array()、「どこにあるか」まで知りたいときはarray_search()と使い分けます。

キーがあるか調べる(array_key_exists)

連想配列で、指定したキーが存在するかを調べるにはarray_key_exists()を使います。

<?php
    $user = ["name" => "田中", "email" => null];

    var_dump(array_key_exists("name", $user));  // bool(true)
    var_dump(array_key_exists("email", $user)); // bool(true)
    var_dump(array_key_exists("tel", $user));   // bool(false)

キーが存在するかを調べる方法にはisset($user["email"])もありますが、isset()は値がnullのときもfalseを返します。キーの有無を正確に調べたいときはarray_key_exists()を使いましょう。

今回の関数のまとめ

関数動き元の配列
array_push(配列, 値…)末尾に追加変わる
array_unshift(配列, 値…)先頭に追加変わる
array_pop(配列)末尾を取り出して削除変わる
array_shift(配列)先頭を取り出して削除変わる
unset(配列[キー])指定した要素を削除変わる
array_values(配列)インデックスを振り直した配列を返す変わらない
array_merge(配列1, 配列2…)結合した配列を返す変わらない
in_array(値, 配列)値があればtrueを返す変わらない
array_search(値, 配列)見つかったキーを返す(なければfalse)変わらない
array_key_exists(キー, 配列)キーがあればtrueを返す変わらない

実務サンプル(お気に入りリストを操作する)

ネットショップの「お気に入りリスト」を想定したサンプルです。追加するときは重複を防ぎ、削除するときは場所を探してから削除します。

<?php
    // 現在のお気に入り(セッションなどに保存されている想定)
    $favorites = ["ノート", "付箋"];

    // ① 追加:すでに入っていなければ末尾に追加する
    $addItem = "消しゴム";
    if (in_array($addItem, $favorites, true)) {
        echo "{$addItem}はすでにお気に入りにあります<br>";
    } else {
        $favorites[] = $addItem;
        echo "{$addItem}をお気に入りに追加しました<br>";
    }

    // ② 削除:場所を探してから削除し、インデックスを振り直す
    $removeItem = "ノート";
    $index = array_search($removeItem, $favorites, true);
    if ($index === false) {
        echo "{$removeItem}はお気に入りにありません<br>";
    } else {
        unset($favorites[$index]);
        $favorites = array_values($favorites);
        echo "{$removeItem}をお気に入りから削除しました<br>";
    }

    // ③ 結果を表示する
    echo "お気に入り(" . count($favorites) . "件):";
    foreach ($favorites as $i => $item) {
        echo ($i + 1) . ".{$item} ";
    }

実行結果は次のとおりです。

消しゴムをお気に入りに追加しました
ノートをお気に入りから削除しました
お気に入り(2件):1.付箋 2.消しゴム

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

  • ①ではin_array()で重複を確認してから追加しているため、同じ商品が2回登録されることはありません
  • ②の「ノート」は先頭(インデックス0)にありますが、=== falseで判定しているため正しく削除できます
  • ②でarray_values()を使ってインデックスを振り直しているため、③の番号が「1.付箋 2.消しゴム」と正しく並びます

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

Q. array_searchで、先頭の要素だけ「見つからない」と判定されます

→ 先頭の要素が見つかったときは0が返り、if ($index)ではfalse扱いになります。if ($index === false)のように、===でfalseと比較してください。


Q. unsetで削除した後、Undefined array keyの警告が出ます

→ unset()で削除しても、インデックスは振り直されません。削除した番号を飛ばしてfor文で取り出そうとすると警告が出ます。$配列 = array_values($配列);で振り直すか、for文ではなくforeach文を使ってください。

おわりに(まとめ)

まとめ

配列の関数を使うと、要素の追加・削除や検索を短く書けます。

  • ✅ 末尾はarray_push・array_pop、先頭はarray_unshift・array_shiftで追加・取り出しができる
  • ✅ unsetで削除するとインデックスに隙間が残るので、必要ならarray_valuesで振り直す
  • ✅ array_mergeは結合した新しい配列を返す(元の配列は変わらない)
  • ✅ in_arrayは値があるかどうか、array_searchは値のある場所を調べる
  • ✅ array_searchの結果は「=== false」で判定する
  • ✅ キーがあるかどうかはarray_key_existsで調べる

次回は、配列の並べ替えや、文字列との変換などに使う関数について解説します。

次回は、配列の要素を並べ替える関数や、配列と文字列を相互に変換する関数などについて解説予定です。

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

関連記事

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

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

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


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


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