この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:7
ページ更新者:guest
更新日時:2026-06-11 07:12:00

タイトル: 配列
SEOタイトル: PHP 配列完全ガイド

この記事の要点
  • PHP 配列は「順序付き連想配列」: index 配列も連想配列も内部的に同じ
  • 短縮構文 [] (PHP 5.4+) と array() どちらも可。[] 推奨
  • 要素追加: $arr[] = "x" / 取得: $arr[0] / 件数: count($arr)
  • 基本操作: array_keys / array_values / in_array / array_search
  • 結合: array_merge (再番号付け) と + 演算子 (左優先) で挙動が違う
  • 高階関数: array_map / array_filter / array_reduce
  • ソート: sort / asort (key 維持) / ksort (key で) / usort (カスタム)
  • Laravel Collection でメソッドチェーンで書きやすくなる

PHP 配列の基本

PHP の配列は順序付き連想配列。index 配列 (0, 1, 2, ...) も連想配列 (文字列キー) も同じ array 型で表現します。順序は挿入順が保たれます。

// 1. 短縮構文 (PHP 5.4+, 推奨)
$fruits = ['apple', 'banana', 'cherry'];

// 2. array() 構文 (旧来)
$fruits = array('apple', 'banana', 'cherry');

// 3. 連想配列
$user = [
    'name' => '田中',
    'age'  => 28,
    'email' => 'tanaka@example.com',
];

// 4. キーを明示した index 配列
$arr = [0 => 'a', 1 => 'b', 5 => 'f'];   // 飛ばしてもOK

// 5. ネスト (多次元)
$grid = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
];
echo $grid[1][2];   // 6

要素の追加・更新・削除

$arr = [];

// 末尾追加
$arr[] = 'a';        // [0=>'a']
$arr[] = 'b';        // [0=>'a', 1=>'b']
array_push($arr, 'c', 'd');

// 先頭追加
array_unshift($arr, 'x');   // ['x', 'a', 'b', 'c', 'd']

// 末尾を取り出す (pop)
$last = array_pop($arr);    // 'd' を取り出し、配列から除去

// 先頭を取り出す (shift)
$first = array_shift($arr); // 'x' を取り出し、配列から除去

// 連想配列の追加・更新
$user['name'] = '田中';
$user['age']  = 29;       // 既存キーなら上書き

// 削除
unset($arr[1]);              // index は再番号付けされない
unset($user['email']);
array_splice($arr, 1, 2);    // index を詰めて削除

件数・有無の確認

$arr = ['a', 'b', 'c'];

count($arr);              // 3
sizeof($arr);             // 3 (count の別名)

// 空かどうか
empty($arr);              // false
count($arr) === 0;        // false

// 値の存在
in_array('b', $arr);            // true
in_array('B', $arr, true);      // false (型一致)

// キーの存在
array_key_exists('name', $user);  // true
isset($user['name']);             // true (ただし null 値だと false)

// 値→キー検索
$idx = array_search('b', $arr);   // 1 (見つからない時は false)

キー・値の取得

$user = ['name' => '田中', 'age' => 28, 'email' => 't@example.com'];

array_keys($user);          // ['name', 'age', 'email']
array_values($user);        // ['田中', 28, 't@example.com']

// 特定の値を持つキーだけ
array_keys($user, 28);      // ['age']

// 反転 (値とキーを入れ替え)
array_flip($user);          // ['田中'=>'name', 28=>'age', ...]

結合・分割

array_merge と + 演算子の違いに注意:

$a = ['a' => 1, 'b' => 2];
$b = ['b' => 3, 'c' => 4];

// array_merge: 右側が勝つ (上書き)
array_merge($a, $b);    // ['a'=>1, 'b'=>3, 'c'=>4]

// + 演算子: 左側が勝つ (キー重複時)
$a + $b;                // ['a'=>1, 'b'=>2, 'c'=>4]

// index 配列の場合
$x = [1, 2, 3];
$y = [4, 5, 6];

array_merge($x, $y);    // [1, 2, 3, 4, 5, 6] ← 再番号付け
$x + $y;                // [1, 2, 3] ← 0,1,2 重複で左を採用

// 分割 (chunk)
array_chunk([1, 2, 3, 4, 5], 2);  // [[1, 2], [3, 4], [5]]

// スライス
array_slice([1, 2, 3, 4, 5], 1, 3);  // [2, 3, 4]

Spread / First-class Callable

// PHP 7.4+: Spread でマージ
$a = [1, 2];
$b = [3, 4];
$c = [...$a, ...$b, 5];   // [1, 2, 3, 4, 5]

// PHP 8.1+: 連想配列 spread
$x = ['a' => 1];
$y = ['b' => 2];
$z = [...$x, ...$y];      // ['a' => 1, 'b' => 2]

// 関数引数の spread
function sum(...$nums) {
    return array_sum($nums);
}
sum(...[1, 2, 3]);        // 6

// PHP 8.1+: First-class Callable
$strs = ['Hello', 'World'];
$upper = array_map(strtoupper(...), $strs);   // ['HELLO', 'WORLD']

高階関数 (map / filter / reduce)

$nums = [1, 2, 3, 4, 5];

// map: 各要素を変換
$doubled = array_map(fn($n) => $n * 2, $nums);   // [2, 4, 6, 8, 10]

// 複数配列同時 map
array_map(fn($a, $b) => $a + $b, [1, 2, 3], [10, 20, 30]);  // [11, 22, 33]

// filter: 条件を満たす要素のみ
$even = array_filter($nums, fn($n) => $n % 2 === 0);  // [1=>2, 3=>4] (key 維持)

// reduce: 畳み込み
$sum = array_reduce($nums, fn($carry, $n) => $carry + $n, 0);   // 15
$product = array_reduce($nums, fn($c, $n) => $c * $n, 1);       // 120

// 文字列の連結
$str = array_reduce(['a', 'b', 'c'], fn($c, $s) => $c . $s, '');  // "abc"

ソート

関数方向キー用途
sort()昇順 (値)再番号付けindex 配列の値ソート
rsort()降順 (値)再番号付けindex 配列の値ソート (逆)
asort()昇順 (値)維持連想配列を値でソート
arsort()降順 (値)維持連想配列を値でソート (逆)
ksort()昇順 (キー)維持連想配列をキーでソート
krsort()降順 (キー)維持連想配列をキーでソート (逆)
usort()カスタム再番号付け比較関数指定
uasort()カスタム維持連想配列をカスタムソート
// オブジェクト配列を年齢順
$users = [
    ['name' => 'A', 'age' => 30],
    ['name' => 'B', 'age' => 25],
    ['name' => 'C', 'age' => 28],
];

usort($users, fn($a, $b) => $a['age'] <=> $b['age']);
// → B(25), C(28), A(30)

// 複数キーソート (年齢→名前)
usort($users, fn($a, $b) => $a['age'] <=> $b['age'] ?: $a['name'] <=> $b['name']);

ループ処理

$arr = ['apple' => 1, 'banana' => 2, 'cherry' => 3];

// foreach (推奨)
foreach ($arr as $value) {
    echo $value;
}

foreach ($arr as $key => $value) {
    echo "$key: $value\n";
}

// 参照渡しで書き換え
foreach ($arr as &$value) {
    $value *= 10;
}
unset($value);   // 参照を解除しないと後でバグの元

// while + each (PHP 7.2 で deprecated, 8.0 で削除)
// → foreach を使うこと

Laravel Collection

Laravel ではCollection クラスが用意されており、メソッドチェーンで書けます:

use Illuminate\Support\Collection;

$users = collect([
    ['name' => 'A', 'age' => 30, 'dept' => 'eng'],
    ['name' => 'B', 'age' => 25, 'dept' => 'sales'],
    ['name' => 'C', 'age' => 28, 'dept' => 'eng'],
]);

// チェーンで書ける
$result = $users
    ->filter(fn($u) => $u['age'] >= 28)
    ->sortBy('age')
    ->pluck('name')
    ->all();
// ['C', 'A']

// グループ集計
$users->groupBy('dept');
$users->sum('age');
$users->avg('age');
$users->max('age');

// Eloquent クエリも Collection
User::where('active', 1)->get()->map(fn($u) => $u->name);

FAQ

Q: array()[] どちらを使うべき?
A: PHP 5.4 以降ならどちらでも動きますが、現代のコードは [] 一択です。短く読みやすい。

Q: 配列の要素が存在するかチェックする時 issetarray_key_exists どちら?
A: isset は値が null の時 false。null も「あり」扱いしたければ array_key_exists。性能は isset の方が速い。

Q: foreach の中で配列を変更すると?
A: foreach はループ開始時にコピーを取るので、ループ中の変更は安全。ただし参照渡し (&$v) を使うときはループ後に unset($v) 忘れずに。