【初心者向け】PHPで配列を操作する方法完全ガイド

PHP

「PHPで配列を組み合わせたり、比較したりしたいけど、どうすればいいの?」
「配列の操作で、いつもarray_mergeを使っているけど、他に方法はないの?」

そんなPHP初心者の方に向けて、配列を操作するための様々な方法をわかりやすく説明します。

この記事を読めば、配列の結合、比較、差分取得など、実用的な配列操作ができるようになります。

スポンサーリンク

配列操作の基本知識

配列操作でできること

PHPでは、配列に対して以下のような操作ができます:

結合 複数の配列を一つにまとめる

比較 二つの配列が同じかどうかを確認

差分取得 配列の違いを見つける

共通要素の抽出 複数の配列で共通する要素を取得

よく使う配列操作の場面

ユーザー設定の管理 デフォルト設定とユーザー設定を組み合わせる

データの比較 更新前後のデータを比較して変更点を確認

検索結果の処理 複数の検索条件の結果を組み合わせる

配列の結合(+ 演算子)

+ 演算子の動作

説明 PHPでは「+」演算子を使って配列を結合できます。ただし、普通の足し算とは動作が違います。

基本的な書き方

$result = $array1 + $array2;

特徴

  • 左側の配列が優先される
  • 同じキーがある場合、左側の値が残る
  • キーの型(数値・文字列)も考慮される

基本的な結合例

説明 文字列キーを持つ配列同士を結合してみましょう。

コード例

<?php
$fruits = ["apple" => "りんご", "banana" => "バナナ"];
$colors = ["apple" => "赤", "orange" => "オレンジ"];

$result = $fruits + $colors;

print_r($result);
?>

実行結果

Array
(
    [apple] => りんご
    [banana] => バナナ
    [orange] => オレンジ
)

解説

  • $fruitsの「apple」が優先されて「りんご」が残る
  • $colorsの「apple」(赤)は無視される
  • 重複しないキー「orange」は追加される

数値キーの配列結合

説明 数値キーの配列でも同じルールが適用されます。

コード例

<?php
$array1 = [0 => "A", 1 => "B", 2 => "C"];
$array2 = [0 => "X", 1 => "Y", 3 => "Z"];

$result = $array1 + $array2;

print_r($result);
?>

実行結果

Array
(
    [0] => A
    [1] => B
    [2] => C
    [3] => Z
)

解説

  • キー0、1は$array1の値(A、B)が優先
  • キー3は$array2にしかないのでZが追加

実用的な使用例

説明 ユーザー設定とデフォルト設定を組み合わせる実用例です。

コード例

<?php
// ユーザーが設定した値
$userSettings = [
    "theme" => "dark",
    "language" => "ja"
];

// システムのデフォルト設定
$defaultSettings = [
    "theme" => "light",
    "language" => "en",
    "notifications" => true,
    "autosave" => false
];

// ユーザー設定を優先して結合
$finalSettings = $userSettings + $defaultSettings;

print_r($finalSettings);
?>

実行結果

Array
(
    [theme] => dark
    [language] => ja
    [notifications] => 1
    [autosave] => 
)

解説

  • ユーザーが設定した値が優先される
  • 設定していない項目はデフォルト値が使われる

配列の比較演算子

== と === の違い

説明 PHPでは配列を比較する方法が2種類あります。

== 演算子(等価比較)

  • キーと値が同じなら順序は関係ない
  • 型の変換が行われる

=== 演算子(同一比較)

  • キー、値、順序、型がすべて同じでなければならない

等価比較(==)の例

説明 順序が違っても、キーと値が同じなら等価と判定されます。

コード例

<?php
$array1 = ["name" => "田中", "age" => 25];
$array2 = ["age" => 25, "name" => "田中"];

var_dump($array1 == $array2);
var_dump($array1 === $array2);
?>

実行結果

bool(true)
bool(false)

解説

  • ==では順序が違っても同じ内容なのでtrue
  • ===では順序も厳密にチェックするのでfalse

型の違いによる比較

説明 数値と文字列の違いも比較に影響します。

コード例

<?php
$array1 = [0 => "1", 1 => "2"];
$array2 = [0 => 1, 1 => 2];

var_dump($array1 == $array2);
var_dump($array1 === $array2);

echo "array1の0番目の型: " . gettype($array1[0]) . "\n";
echo "array2の0番目の型: " . gettype($array2[0]) . "\n";
?>

実行結果

bool(true)
bool(false)
array1の0番目の型: string
array2の0番目の型: integer

解説

  • ==では型変換されて”1″と1が等価と判定
  • ===では型が違うのでfalse

配列比較の実用例

説明 フォームデータの変更確認に使える例です。

コード例

<?php
// 元のユーザー情報
$originalData = [
    "name" => "田中太郎",
    "email" => "tanaka@example.com",
    "age" => 30
];

// 更新されたユーザー情報
$updatedData = [
    "name" => "田中太郎",
    "email" => "tanaka@newdomain.com",
    "age" => 30
];

// データが変更されたかチェック
if ($originalData !== $updatedData) {
    echo "データが変更されました\n";
    
    // どの項目が変更されたかを確認
    foreach ($originalData as $key => $value) {
        if ($value !== $updatedData[$key]) {
            echo "変更された項目: $key\n";
            echo "変更前: $value\n";
            echo "変更後: {$updatedData[$key]}\n";
        }
    }
} else {
    echo "データに変更はありません\n";
}
?>

実行結果

データが変更されました
変更された項目: email
変更前: tanaka@example.com
変更後: tanaka@newdomain.com

配列の差分と共通要素

array_diff() による差分取得

説明 array_diff()関数は、一つ目の配列にあって、他の配列にない要素を取得します。

基本的な使い方

array_diff(配列1, 配列2, 配列3, ...)

コード例

<?php
$fruits1 = ["apple", "banana", "orange", "grape"];
$fruits2 = ["banana", "grape", "melon"];

$diff = array_diff($fruits1, $fruits2);

print_r($diff);
?>

実行結果

Array
(
    [0] => apple
    [2] => orange
)

解説

  • $fruits1にあって$fruits2にない要素が抽出される
  • 元のキー(0、2)が保持される

array_intersect() による共通要素取得

説明 array_intersect()関数は、すべての配列に共通する要素を取得します。

コード例

<?php
$group1 = ["田中", "佐藤", "山田", "鈴木"];
$group2 = ["佐藤", "山田", "高橋", "渡辺"];
$group3 = ["山田", "佐藤", "小林"];

$common = array_intersect($group1, $group2, $group3);

print_r($common);
?>

実行結果

Array
(
    [1] => 佐藤
    [2] => 山田
)

解説

  • 3つの配列すべてに含まれる要素のみ抽出
  • 最初の配列のキーが保持される

キーを考慮した差分・共通要素

array_diff_assoc() の使用

<?php
$settings1 = ["theme" => "dark", "lang" => "ja", "size" => "large"];
$settings2 = ["theme" => "light", "lang" => "ja", "size" => "medium"];

$diff = array_diff_assoc($settings1, $settings2);

print_r($diff);
?>

実行結果

Array
(
    [theme] => dark
    [size] => large
)

解説

  • キーと値の組み合わせで比較
  • 異なる組み合わせのみ抽出

実用的な応用例

説明 ショッピングカートの在庫確認システムの例です。

コード例

<?php
// 在庫商品
$stockItems = ["pen", "notebook", "eraser", "ruler", "pencil"];

// カートの商品
$cartItems = ["pen", "notebook", "marker", "tape"];

// 在庫にない商品(買えない商品)
$unavailable = array_diff($cartItems, $stockItems);

// 購入可能な商品
$available = array_intersect($cartItems, $stockItems);

echo "購入可能な商品:\n";
foreach ($available as $item) {
    echo "- $item\n";
}

echo "\n在庫切れの商品:\n";
foreach ($unavailable as $item) {
    echo "- $item\n";
}
?>

実行結果

購入可能な商品:
- pen
- notebook

在庫切れの商品:
- marker
- tape

array_merge() との違い

+ 演算子 vs array_merge()

説明 配列を結合する方法として、+演算子とarray_merge()関数があります。動作が大きく異なるので注意が必要です。

+ 演算子の特徴

  • 同じキーは左側が優先(上書きしない)
  • キーの型と値を保持

array_merge()の特徴

  • 同じキーは右側が優先(上書きする)
  • 数値キーは振り直される

比較例

コード例

<?php
$array1 = ["a" => 1, "b" => 2, 0 => "X"];
$array2 = ["a" => 3, "c" => 4, 0 => "Y"];

echo "+ 演算子の結果:\n";
$result1 = $array1 + $array2;
print_r($result1);

echo "\narray_merge()の結果:\n";
$result2 = array_merge($array1, $array2);
print_r($result2);
?>

実行結果

+ 演算子の結果:
Array
(
    [a] => 1
    [b] => 2
    [0] => X
    [c] => 4
)

array_merge()の結果:
Array
(
    [a] => 3
    [b] => 2
    [0] => X
    [1] => Y
    [c] => 4
)

解説

  • +演算子:「a」は1が残る、数値キー0も保持
  • array_merge():「a」は3で上書き、数値キーは振り直し

どちらを使うべき?

+ 演算子を使う場面

  • デフォルト値との結合
  • キーを保持したい場合
  • 左側を優先したい場合

array_merge()を使う場面

  • 後の値で上書きしたい場合
  • 数値キーを振り直したい場合
  • 純粋に配列を連結したい場合

多次元配列の操作

多次元配列の結合

説明 多次元配列の操作では、一段階の操作だけでは完全に結合できません。

問題のある例

<?php
$config1 = [
    "database" => ["host" => "localhost", "port" => 3306],
    "cache" => ["driver" => "redis"]
];

$config2 = [
    "database" => ["host" => "remote.server", "name" => "myapp"],
    "mail" => ["driver" => "smtp"]
];

$result = $config1 + $config2;
print_r($result);
?>

実行結果

Array
(
    [database] => Array
        (
            [host] => localhost
            [port] => 3306
        )
    [cache] => Array
        (
            [driver] => redis
        )
    [mail] => Array
        (
            [driver] => smtp
        )
)

問題点

  • $config2のdatabase設定(name)が消えている
  • 多次元配列の深い部分まで結合されていない

多次元配列の再帰的結合

説明 多次元配列を適切に結合するための関数を作成します。

コード例

<?php
function arrayMergeRecursive($array1, $array2) {
    $result = $array1;
    
    foreach ($array2 as $key => $value) {
        if (isset($result[$key]) && is_array($result[$key]) && is_array($value)) {
            $result[$key] = arrayMergeRecursive($result[$key], $value);
        } else {
            $result[$key] = $value;
        }
    }
    
    return $result;
}

$config1 = [
    "database" => ["host" => "localhost", "port" => 3306],
    "cache" => ["driver" => "redis"]
];

$config2 = [
    "database" => ["host" => "remote.server", "name" => "myapp"],
    "mail" => ["driver" => "smtp"]
];

$result = arrayMergeRecursive($config1, $config2);
print_r($result);
?>

実行結果

Array
(
    [database] => Array
        (
            [host] => remote.server
            [port] => 3306
            [name] => myapp
        )
    [cache] => Array
        (
            [driver] => redis
        )
    [mail] => Array
        (
            [driver] => smtp
        )
)

解説

  • 深い階層まで適切に結合される
  • 既存の値は保持しつつ、新しい値も追加される

よくある間違いと注意点

キーの型に注意

問題のあるコード

<?php
$array1 = [0 => "A", "0" => "B"];
$array2 = [0 => "C"];

print_r($array1);
print_r($array1 + $array2);
?>

実行結果

Array
(
    [0] => B
)
Array
(
    [0] => B
)

解説

  • 数値の0と文字列の”0″は同じキーとして扱われる
  • 後から定義した値で上書きされる

空の配列との操作

コード例

<?php
$array1 = ["a" => 1, "b" => 2];
$empty = [];

var_dump($array1 + $empty);
var_dump($empty + $array1);
var_dump($array1 == $empty);
?>

実行結果

array(2) {
  ["a"]=> int(1)
  ["b"]=> int(2)
}
array(2) {
  ["a"]=> int(1)
  ["b"]=> int(2)
}
bool(false)

配列とnullの比較

注意が必要なケース

<?php
$array = ["a" => 1];
$null = null;

var_dump($array == $null);
var_dump($array === $null);
var_dump(empty($array));
var_dump(isset($array));
?>

実行結果

bool(false)
bool(false)
bool(false)
bool(true)

まとめ:配列操作をマスターしよう

PHPの配列操作は、適切な方法を選ぶことで効率的なプログラムを書けるようになります。

今日覚えたこと

  • + 演算子:左側優先でキー保持の結合
  • 比較演算子:==は値、===は型と順序も厳密比較
  • array_diff():差分の抽出
  • array_intersect():共通要素の抽出
  • 使い分け:目的に応じて適切な方法を選択

まずは基本的な+演算子から始めましょう
慣れてきたら、比較演算子や配列関数も組み合わせて、より複雑な配列操作にチャレンジしてみてください。

コメント

タイトルとURLをコピーしました