7.

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) 忘れずに。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 記述方法
  2. コメント
  3. 変数の宣言
  4. 関数
  5. 演算子
  6. 条件文
  7. 配列
  8. 連想配列
  9. ループ処理
  10. 非同期処理
  11. 同期処理
  12. 確認ウィンドウを表示する方法
  13. 文字の置換
  14. base urlを取得する方法
  15. formのsubmit前にjavascriptを呼び出す方法
  16. undefinedのイコール判定
  17. Javascript のみで form を post で submit する方法

最近更新/作成されたページ