| この記事の要点 |
|
作り方
// 添字配列(キーは 0 から自動採番)
$fruits = ['りんご', 'みかん', 'ぶどう'];
echo $fruits[0]; // りんご
// 連想配列
$user = [
'name' => '田中',
'age' => 30,
'admin' => false, // 末尾のカンマを残せる
];
echo $user['name']; // 田中
// 混在もできる(同じ型なので)
$mixed = [0 => 'a', 'key' => 'b', 5 => 'c'];
// 多次元
$rows = [
['id' => 1, 'name' => '田中'],
['id' => 2, 'name' => '鈴木'],
];
echo $rows[1]['name']; // 鈴木
$old = array('a', 'b'); // 古い書き方。動くが [] を使う
追加・更新・削除
$a = ['x'];
$a[] = 'y'; // 末尾に追加(最も速い)
$a[10] = 'z'; // キーを指定して追加
$a[] = 'w'; // 次は 11 になる(最大の数値キー + 1)
array_push($a, 'v', 'u'); // 複数まとめて
$a[0] = 'X'; // 更新
unset($a[0]); // 削除(キーは詰められない)
print_r(array_values($a)); // 詰め直したいときは array_values
$first = array_shift($a); // 先頭を取り出す(以降のキーが振り直される)
$last = array_pop($a); // 末尾を取り出す
array_unshift($a, 'head'); // 先頭に追加
unset() はキーを詰めません。[0 => 'a', 2 => 'c'] のような穴あきになるため、JSON にすると配列ではなくオブジェクトとして出力されます。連番であることが必要なら array_values() を通してください。
キーの型変換ルール
$a = [];
$a["1"] = 'a'; // int 1 になる
$a[1.9] = 'b'; // 切り捨てられて int 1 → 上書き
$a[true] = 'c'; // int 1 → 上書き
$a[null] = 'd'; // "" (空文字)
$a["01"] = 'e'; // "01" は数値扱いされない → 文字列キーのまま
var_dump($a);
// [1 => 'c', "" => 'd', "01" => 'e']
郵便番号や商品コードのように先頭が 0 の文字列はそのまま残りますが、"1" のような数値文字列は整数キーに変換されます。ID をキーにするときは、この違いで === の比較が食い違うことがあります。
ループ
foreach ($fruits as $fruit) {
echo $fruit;
}
foreach ($user as $key => $value) {
echo "{$key}: {$value}";
}
// 多次元は分割代入で受けられる
foreach ($rows as ['id' => $id, 'name' => $name]) {
echo "{$id}: {$name}";
}
// 値を書き換えたいときは参照。使い終わったら必ず unset
foreach ($fruits as &$f) { $f = "【{$f}】"; }
unset($f);
for ($i = 0, $n = count($fruits); $i < $n; $i++) {
echo $fruits[$i]; // 連番のときだけ使える
}
よく使う関数
| やりたいこと | 関数 |
|---|---|
| 件数を数える | count($a) |
| キーだけ / 値だけ取り出す | array_keys() / array_values() |
| 各要素を変換する | array_map() |
| 条件で絞り込む | array_filter() |
| 1 つの値にまとめる | array_reduce() / array_sum() |
| 含まれているか | in_array() / array_search() |
| キーがあるか | array_key_exists() / isset() |
| 並べ替え | sort() usort() ksort() asort() |
| 重複を除く | array_unique() |
| 結合する | array_merge() / [...$a, ...$b] |
| 一部を切り出す | array_slice() |
| 文字列にする / 分ける | implode() / explode() |
$nums = [1, 2, 3, 4, 5];
print_r(array_map(fn($n) => $n * 10, $nums)); // [10,20,30,40,50]
print_r(array_filter($nums, fn($n) => $n % 2 === 0)); // [1=>2, 3=>4] キーは保たれる
echo array_sum($nums); // 15
echo implode(', ', $nums); // 1, 2, 3, 4, 5
// 連想配列から特定の列だけ抜き出す
print_r(array_column($rows, 'name')); // ['田中','鈴木']
print_r(array_column($rows, 'name', 'id')); // [1=>'田中', 2=>'鈴木']
array_filter() はキーを保ちます。そのまま json_encode() すると配列ではなくオブジェクトになるため、必要なら array_values() を通します。
結合の 2 種類
$a = ['x' => 1, 'y' => 2];
$b = ['y' => 99, 'z' => 3];
print_r(array_merge($a, $b)); // ['x'=>1, 'y'=>99, 'z'=>3] 後ろが勝つ
print_r($a + $b); // ['x'=>1, 'y'=>2, 'z'=>3] 前が勝つ
// 数値キーの扱いが違う
print_r(array_merge([1, 2], [3])); // [1, 2, 3] 振り直される
print_r([1, 2] + [3, 4, 5]); // [1, 2, 5] キー 0,1 は前が勝つ
設定値に既定値を当てるときは $config + $defaults、リストを繋げるときは array_merge()、と覚えると迷いません。
比較・検索の落とし穴
$a = ['1', '2', '3'];
var_dump(in_array(1, $a)); // true ← 型を無視して比較している
var_dump(in_array(1, $a, true)); // false 厳密比較
var_dump(array_search('2', $a)); // int(1)
var_dump(array_search('x', $a)); // false
// 0 が返る場合と false が返る場合を == で区別できない
if (array_search('1', $a) !== false) { /* 見つかった */ }
// 配列同士の比較
var_dump([1,2] == [1,2]); // true 同じキーと値
var_dump([1,2] === [1,2]); // true 順序と型も同じ
var_dump(['a'=>1,'b'=>2] === ['b'=>2,'a'=>1]); // false 順序が違う
var_dump(['a'=>1,'b'=>2] == ['b'=>2,'a'=>1]); // true == なら順序を見ない
in_array() の第 3 引数は必ず true にするのが安全です。省略すると in_array(0, ['abc']) のような判定が PHP のバージョンによって変わります。
配列とオブジェクトの変換
$obj = (object)['name' => '田中']; // 配列 → stdClass
echo $obj->name;
$arr = (array)$obj; // オブジェクト → 配列
print_r($arr);
$json = json_encode($user, JSON_UNESCAPED_UNICODE);
$back = json_decode($json, true); // true で連想配列として受け取る
詳細は オブジェクトを配列に変換する方法 を参照してください。
関連
子ページ
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- djangoのテンプレートの作成とヘッダー・フッターの共通化 2026-10-03 21:41:49
- テンプレートフラグメント(ヘッダー等の共有化) 2026-10-03 21:41:49
- reCAPTCHA v3 使い方(サンプル付き) 2026-10-03 21:37:05
- Content-Type一覧|MIMEタイプとはとHTTPでの主な使用場面 2026-10-03 21:37:05
- SpringにおけるAOPの使い方 2026-10-03 21:37:05
- X (Twitter) API でツイートできないがエラーが出ない問題の原因と対処 2026-10-03 11:33:01
- X (Twitter) API アプリケーション登録完全ガイド|v2・Bearer Token・OAuth 2.0 PKCE 2026-10-03 11:33:01
- X (Twitter) API 完全ガイド|従量課金の料金・単価(2026年10月)と v2 移行 2026-10-03 11:32:40
- Google DeepMind とは?Gemini・AlphaFold の開発元 2026-10-03 11:26:56
- Cursor とは?AI 統合型コードエディタの使い方・料金 2026-10-03 11:26:56
- Claude (Anthropic) とは?AIチャットの使い方・モデルファミリ・API 2026-10-03 11:26:56
- AIベンダー一覧:OpenAI・Anthropic・Google DeepMind・Microsoft・Meta 2026-10-03 11:26:56
- クラウド・インフラ完全ガイド — AWS/Azure/GCP/Kubernetes 2026-10-03 11:26:56
- テキストエディタ完全比較 (VS Code / Cursor / Vim / Emacs / IDE) 2026-10-03 11:26:56
- プログラミング学習プラットフォーム|Scratch・micro:bit ほか 2026-10-03 11:26:56