PHPを学び始めると、かなり早い段階で「配列」が登場します。
そして少し進むと、「リスト」「連想配列」「多次元配列」「list()」「array_is_list()」といった言葉も出てきます。
ここで混乱しやすいのは、PHPではこれらの多くが、すべて array 型で表現されるという点です。
JavaScriptであれば、配列は Array、オブジェクトは {} のように分けて考えることが多いです。
Pythonであれば、リストは list、辞書は dict として別の型になっています。
しかしPHPでは、値の一覧も、キー付きのデータも、配列の中に配列が入ったデータも、基本的にはすべて array 型で扱います。
// リスト的な配列
$fruits = ['apple', 'banana', 'orange'];
// 連想配列
$user = [
'name' => 'Tanaka',
'age' => 30,
];
// 多次元配列
$users = [
[
'name' => 'Tanaka',
'age' => 30,
],
[
'name' => 'Sato',
'age' => 25,
],
];
つまり、PHPの配列を理解するうえで重要なのは、単に「配列とは値を並べたもの」と覚えることではありません。
キーと値の関係を持つデータ構造として理解することが大切です。
PHPの配列とは
PHPの配列は、正確には 順序付きマップ のようなデータ構造です。
マップとは、キーと値をセットで管理する仕組みのことです。
たとえば、次のような配列があるとします。
$user = [
'name' => 'Tanaka',
'age' => 30,
];
この配列には、次のようなキーと値の組み合わせが入っています。
'name' => 'Tanaka'
'age' => 30
name というキーには Tanaka という値が対応しています。
age というキーには 30 という値が対応しています。
値を取り出すときは、キーを指定します。
echo $user['name']; // Tanaka
echo $user['age']; // 30
PHPの配列は、キーと値を順番付きで保持できます。
そのため、単なる値の一覧としても使えますし、名前付きのデータを管理する連想配列としても使えます。
PHPの配列の主な種類
PHPの配列は、使い方によって大きく次のように分類できます。
| 種類 | 説明 | 例 |
|---|---|---|
| リスト・インデックス配列 | 0 から始まる連続した整数キーを持つ配列 | ['apple', 'banana'] |
| 連想配列 | 文字列キーなど、意味のあるキーで値を管理する配列 | ['name' => 'Tanaka'] |
| 多次元配列 | 配列の中に配列が入っているもの | [['name' => 'A'], ['name' => 'B']] |
| 混在配列 | 数値キーと文字列キーが混ざっている配列 | [0 => 'apple', 'name' => 'Tanaka'] |
それぞれ詳しく見ていきます。
リスト・インデックス配列
リストは、値を順番に並べたような配列です。
$fruits = ['apple', 'banana', 'orange'];
これは、実際には次のような配列として扱われます。
$fruits = [
0 => 'apple',
1 => 'banana',
2 => 'orange',
];
PHPでは、キーを省略して値だけを書くと、自動的に 0 から始まる整数キーが付きます。
echo $fruits[0]; // apple
echo $fruits[1]; // banana
echo $fruits[2]; // orange
このように、0, 1, 2 と順番に並んだ整数キーを持つ配列は、一般的に「リスト」や「インデックス配列」と呼ばれます。
連想配列
連想配列は、文字列キーなどを使って値を管理する配列です。
$user = [
'name' => 'Yamada',
'email' => 'yamada@example.com',
'age' => 28,
];
値を取り出すときは、キー名を指定します。
echo $user['name']; // Yamada
echo $user['email']; // yamada@example.com
echo $user['age']; // 28
連想配列は、1件分のデータを表すときによく使います。
たとえば、ユーザー情報であれば次のように書けます。
$user = [
'id' => 1,
'name' => 'Tanaka',
'email' => 'tanaka@example.com',
];
記事情報であれば、次のように表現できます。
$post = [
'title' => 'PHPの基本',
'author' => 'Sato',
'published' => true,
];
リストが「値の一覧」だとすれば、連想配列は「名前付きのデータのまとまり」と考えると分かりやすいです。
多次元配列
多次元配列は、配列の中にさらに配列が入っている構造です。
$users = [
[
'name' => 'Tanaka',
'age' => 30,
],
[
'name' => 'Sato',
'age' => 25,
],
[
'name' => 'Suzuki',
'age' => 28,
],
];
この例では、$users はユーザー一覧です。
その中に、1人分のユーザー情報を表す連想配列が複数入っています。
値を取り出すときは、段階的にキーを指定します。
echo $users[0]['name']; // Tanaka
echo $users[1]['age']; // 25
表で見ると、次のようなイメージです。
| インデックス | name | age |
|---|---|---|
| 0 | Tanaka | 30 |
| 1 | Sato | 25 |
| 2 | Suzuki | 28 |
実務では、データベースから取得した一覧データ、APIレスポンス、記事一覧、商品一覧などで多次元配列を扱うことがよくあります。
PHPにおける「リスト」とは
PHPで「リスト」と言う場合、文脈によって少し意味が変わります。
主に次の3つの意味で使われます。
| 用語 | 意味 |
|---|---|
| 一般的なリスト | 値が順番に並んだ配列 |
list() | 配列の値を複数の変数に代入する構文 |
array_is_list() のリスト | 0 から始まる連続した整数キーを持つ配列 |
順番に見ていきます。
一般的な意味でのリスト
一般的には、次のような配列をリストと呼ぶことが多いです。
$colors = ['red', 'blue', 'green'];
これは内部的には、次のようなキーを持っています。
[
0 => 'red',
1 => 'blue',
2 => 'green',
]
つまり、キーが0から始まり、途中で抜けずに連続している配列です。
このような配列は、値の一覧を扱うときに使います。
$tags = ['SEO', '広告運用', 'アクセス解析'];
$ids = [10, 25, 38];
$categories = ['news', 'blog', 'column'];
list() 構文
PHPには、list() という構文があります。
これは、配列の値を複数の変数にまとめて代入するためのものです。
$fruits = ['apple', 'banana', 'orange'];
list($first, $second, $third) = $fruits;
echo $first; // apple
echo $second; // banana
echo $third; // orange
PHP 7.1以降では、短縮構文として次のようにも書けます。
[$first, $second, $third] = $fruits;
こちらのほうが現代的で、コードもすっきりします。
$user = ['Tanaka', 30];
[$name, $age] = $user;
echo $name; // Tanaka
echo $age; // 30
基本的には、0 番目、1 番目、2 番目……という順番で値が代入されます。
$data = [
0 => 'apple',
1 => 'banana',
];
[$a, $b] = $data;
echo $a; // apple
echo $b; // banana
ただし、PHP 7.1以降では、キーを指定して連想配列を分解することもできます。
$user = [
'name' => 'Tanaka',
'age' => 30,
];
['name' => $name, 'age' => $age] = $user;
echo $name; // Tanaka
echo $age; // 30
このように、list() や [] による分解代入は、リスト形式の配列だけでなく、キーを明示すれば連想配列にも使えます。
array_is_list() で判定できるリスト
PHP 8.1以降では、配列がリスト形式かどうかを判定する array_is_list() が使えます。
$array = ['apple', 'banana', 'orange'];
var_dump(array_is_list($array));
結果は次のようになります。
bool(true)
array_is_list() が true を返すのは、配列のキーが 0 から始まり、途中で抜けずに連続している場合です。
$array = [
0 => 'a',
1 => 'b',
2 => 'c',
];
var_dump(array_is_list($array)); // true
空配列もリストとして扱われます。
$array = [];
var_dump(array_is_list($array)); // true
一方で、次のような配列はリストではありません。
$array = [
1 => 'a',
2 => 'b',
];
var_dump(array_is_list($array)); // false
キーが 0 から始まっていないためです。
また、途中のキーが抜けている場合もリストではありません。
$array = [
0 => 'a',
2 => 'b',
];
var_dump(array_is_list($array)); // false
文字列キーが混ざっている場合も、リストではありません。
$array = [
0 => 'a',
'name' => 'Tanaka',
1 => 'b',
];
var_dump(array_is_list($array)); // false
配列とリストの違い
PHPでは、リストは配列の一種です。
すべてのリストは配列ですが、すべての配列がリストというわけではありません。
$fruits = ['apple', 'banana'];
これは配列でもあり、リストでもあります。
一方で、次のような配列は配列ではありますが、リストではありません。
$user = [
'name' => 'Tanaka',
'age' => 30,
];
違いを整理すると、次のようになります。
| 種類 | 説明 | リストか |
|---|---|---|
['a', 'b', 'c'] | 0から始まる連続した整数キー | はい |
[0 => 'a', 1 => 'b'] | 明示的に連続した整数キーを指定 | はい |
[1 => 'a', 2 => 'b'] | 0から始まっていない | いいえ |
[0 => 'a', 2 => 'b'] | キーが途中で抜けている | いいえ |
['name' => 'Tanaka'] | 文字列キーを使っている | いいえ |
[0 => 'a', 'name' => 'Tanaka'] | 数値キーと文字列キーが混在 | いいえ |
PHPの配列を扱うときは、値だけでなく、キーがどうなっているかを見ることが重要です。
配列の作り方
PHPで配列を作る方法は、主に2つあります。
[] を使う書き方
現在のPHPでは、こちらの書き方が一般的です。
$fruits = ['apple', 'banana', 'orange'];
連想配列も作れます。
$user = [
'name' => 'Tanaka',
'age' => 30,
];
array() を使う書き方
古いコードでは、array() を使った書き方もよく見かけます。
$fruits = array('apple', 'banana', 'orange');
連想配列も同じです。
$user = array(
'name' => 'Tanaka',
'age' => 30,
);
現在は [] のほうが短く書けるため、特別な理由がなければ [] を使えば問題ありません。
配列に値を追加する
末尾に追加する
配列の末尾に値を追加するときは、次のように書きます。
$fruits = ['apple', 'banana'];
$fruits[] = 'orange';
print_r($fruits);
結果は次の通りです。
Array
(
[0] => apple
[1] => banana
[2] => orange
)
$fruits[] = 'orange'; と書くと、PHPが自動で数値キーを付けて追加します。
ただし、ここで注意したいことがあります。
PHPは単純に「現在の要素数」を見てキーを付けるわけではありません。
基本的には、既存の最大整数キーに1を足したキーが使われます。
$array = [
0 => 'a',
1 => 'b',
2 => 'c',
];
unset($array[2]);
$array[] = 'd';
print_r($array);
結果は次のようになります。
Array
(
[0] => a
[1] => b
[3] => d
)
2 が空いていても、追加された値のキーは 3 になります。
リストとして扱いたい場合は、削除後に array_values() でキーを振り直すと安全です。
$array = array_values($array);
キーを指定して追加する
連想配列では、キーを指定して値を追加できます。
$user = [
'name' => 'Tanaka',
];
$user['age'] = 30;
print_r($user);
結果は次のようになります。
Array
(
[name] => Tanaka
[age] => 30
)
同じキーを指定した場合は、値が上書きされます。
$user = [
'name' => 'Tanaka',
'age' => 30,
];
$user['age'] = 31;
echo $user['age']; // 31
配列から値を取り出す
リストの場合は、数値キーを指定して取り出します。
$fruits = ['apple', 'banana', 'orange'];
echo $fruits[0]; // apple
echo $fruits[1]; // banana
echo $fruits[2]; // orange
連想配列の場合は、文字列キーを指定して取り出します。
$user = [
'name' => 'Tanaka',
'age' => 30,
];
echo $user['name']; // Tanaka
echo $user['age']; // 30
存在しないキーに注意する
配列から値を取り出すときに、存在しないキーを指定すると警告が出ることがあります。
$user = [
'name' => 'Tanaka',
];
echo $user['age'];
この場合、age というキーが存在しません。
安全に取り出すには、null合体演算子 ?? を使うと便利です。
echo $user['age'] ?? '';
初期値を指定したい場合は、次のように書けます。
$age = $user['age'] ?? '未登録';
isset() と array_key_exists() の違い
配列のキーが存在するか確認するときは、isset() や array_key_exists() を使います。
ただし、この2つには違いがあります。
$user = [
'name' => 'Tanaka',
'age' => null,
];
この場合、isset() は false になります。
var_dump(isset($user['age'])); // false
なぜなら、isset() はキーが存在していても、値が null の場合は false を返すからです。
一方で、array_key_exists() は true になります。
var_dump(array_key_exists('age', $user)); // true
array_key_exists() は、値が null でも、キーそのものが存在していれば true を返します。
| 関数 | キーが存在する | 値がnull |
|---|---|---|
isset() | true | false |
array_key_exists() | true | true |
使い分けとしては、次のように考えるとよいです。
// 値がnullでないことも確認したい
isset($user['age']);
// キーの存在だけを確認したい
array_key_exists('age', $user);
配列をループする
配列の中身を順番に処理するときは、foreach を使うのが一般的です。
値だけを取り出す
$fruits = ['apple', 'banana', 'orange'];
foreach ($fruits as $fruit) {
echo $fruit . PHP_EOL;
}
結果は次のようになります。
apple
banana
orange
キーと値を取り出す
連想配列では、キーと値を両方取り出すこともよくあります。
$user = [
'name' => 'Tanaka',
'age' => 30,
'email' => 'tanaka@example.com',
];
foreach ($user as $key => $value) {
echo $key . ': ' . $value . PHP_EOL;
}
結果は次の通りです。
name: Tanaka
age: 30
email: tanaka@example.com
HTMLに出力する場合
PHPで配列の値をHTMLに出力する場合は、エスケープ処理を行うことが大切です。
<ul>
<?php foreach ($fruits as $fruit): ?>
<li><?php echo htmlspecialchars($fruit, ENT_QUOTES, 'UTF-8'); ?></li>
<?php endforeach; ?>
</ul>
外部から取得した値やユーザー入力をそのままHTMLに出力すると、XSSなどのセキュリティリスクにつながる可能性があります。
WordPressであれば、文脈に応じて次のような関数を使います。
esc_html($title);
esc_url($url);
esc_attr($value);
配列の要素数を数える
配列の要素数は count() で取得できます。
$fruits = ['apple', 'banana', 'orange'];
echo count($fruits); // 3
空配列かどうかを判定する場合は、次のように書けます。
if (count($fruits) > 0) {
echo '要素があります';
}
また、次のように empty() を使うこともあります。
if (!empty($fruits)) {
echo '要素があります';
}
ただし、empty() は配列以外にも、''、'0'、0、null、false などを空と判定します。
配列であることが分かっている場合には便利ですが、値の種類が曖昧な場合は注意しましょう。
配列から値を削除する
配列の要素を削除するときは、unset() を使います。
$fruits = ['apple', 'banana', 'orange'];
unset($fruits[1]);
print_r($fruits);
結果は次のようになります。
Array
(
[0] => apple
[2] => orange
)
ここで重要なのは、unset() で削除しても、キーは自動的に詰め直されないという点です。
この配列は、キーが 0 と 2 になっています。
1 が抜けているため、リストではありません。
var_dump(array_is_list($fruits)); // false
リストとして扱いたい場合は、array_values() でキーを振り直します。
$fruits = array_values($fruits);
print_r($fruits);
結果は次のようになります。
Array
(
[0] => apple
[1] => orange
)
よく使う配列関数
PHPには配列を扱うための関数が多く用意されています。
ここでは、実務で特によく使うものを紹介します。
array_push()
配列の末尾に要素を追加します。
$fruits = ['apple', 'banana'];
array_push($fruits, 'orange', 'grape');
print_r($fruits);
結果です。
Array
(
[0] => apple
[1] => banana
[2] => orange
[3] => grape
)
ただし、1つだけ追加する場合は、次の書き方のほうがシンプルです。
$fruits[] = 'orange';
array_pop()
配列の末尾から要素を取り出し、その要素を配列から削除します。
$fruits = ['apple', 'banana', 'orange'];
$last = array_pop($fruits);
echo $last; // orange
このあと、$fruits は次の状態になります。
['apple', 'banana']
array_shift()
配列の先頭から要素を取り出し、その要素を配列から削除します。
$fruits = ['apple', 'banana', 'orange'];
$first = array_shift($fruits);
echo $first; // apple
このあと、$fruits は次の状態になります。
['banana', 'orange']
array_unshift()
配列の先頭に要素を追加します。
$fruits = ['banana', 'orange'];
array_unshift($fruits, 'apple');
print_r($fruits);
結果は次の通りです。
Array
(
[0] => apple
[1] => banana
[2] => orange
)
in_array()
配列の中に指定した値があるか確認します。
$fruits = ['apple', 'banana', 'orange'];
if (in_array('banana', $fruits, true)) {
echo 'bananaがあります';
}
第3引数に true を指定すると、型も含めて厳密に比較します。
var_dump(in_array('1', [1, 2, 3])); // true
var_dump(in_array('1', [1, 2, 3], true)); // false
実務では、意図しない一致を避けるために、第3引数に true を指定することをおすすめします。
array_search()
配列の中から値を探し、見つかった場合はそのキーを返します。
$fruits = ['apple', 'banana', 'orange'];
$key = array_search('banana', $fruits, true);
echo $key; // 1
見つからなかった場合は false が返ります。
ここで注意したいのは、キーが 0 の場合です。
$key = array_search('apple', $fruits, true);
この場合、戻り値は 0 です。
0 は条件式では false のように扱われるため、次の書き方は危険です。
if ($key) {
echo '見つかりました';
}
正しくは、次のように厳密比較します。
if ($key !== false) {
echo '見つかりました';
}
array_keys()
配列のキーだけを取り出します。
$user = [
'name' => 'Tanaka',
'age' => 30,
];
$keys = array_keys($user);
print_r($keys);
結果は次の通りです。
Array
(
[0] => name
[1] => age
)
array_values()
配列の値だけを取り出し、数値キーを 0 から振り直します。
$user = [
'name' => 'Tanaka',
'age' => 30,
];
$values = array_values($user);
print_r($values);
結果です。
Array
(
[0] => Tanaka
[1] => 30
)
array_values() は、unset() や array_filter() のあとにキーを詰め直したい場合にもよく使います。
array_map()
配列の各要素に処理を適用し、新しい配列を作ります。
$numbers = [1, 2, 3];
$doubled = array_map(function ($number) {
return $number * 2;
}, $numbers);
print_r($doubled);
結果です。
Array
(
[0] => 2
[1] => 4
[2] => 6
)
アロー関数を使うと、より短く書けます。
$numbers = [1, 2, 3];
$doubled = array_map(fn($number) => $number * 2, $numbers);
array_filter()
条件に合う要素だけを残します。
$numbers = [1, 2, 3, 4, 5];
$evenNumbers = array_filter($numbers, function ($number) {
return $number % 2 === 0;
});
print_r($evenNumbers);
結果は次のようになります。
Array
(
[1] => 2
[3] => 4
)
array_filter() はキーを保持します。
そのため、リストとして扱いたい場合は、array_values() でキーを振り直します。
$evenNumbers = array_values($evenNumbers);
array_reduce()
配列の値を1つの結果にまとめます。
$numbers = [1, 2, 3, 4];
$total = array_reduce($numbers, function ($carry, $number) {
return $carry + $number;
}, 0);
echo $total; // 10
合計値を出す、集計する、複雑なデータを1つの値に変換する、といった場面で使います。
配列の結合
PHPで配列を結合するときは、主に array_merge() と + 演算子を使います。
array_merge()
$a = ['apple', 'banana'];
$b = ['orange', 'grape'];
$result = array_merge($a, $b);
print_r($result);
結果です。
Array
(
[0] => apple
[1] => banana
[2] => orange
[3] => grape
)
連想配列の場合、同じ文字列キーがあると、後ろの配列の値で上書きされます。
$a = [
'name' => 'Tanaka',
'age' => 30,
];
$b = [
'age' => 31,
'email' => 'tanaka@example.com',
];
$result = array_merge($a, $b);
print_r($result);
結果です。
Array
(
[name] => Tanaka
[age] => 31
[email] => tanaka@example.com
)
age は後ろの配列 $b の値で上書きされています。
+ 演算子
PHPでは、配列同士を + で結合することもできます。
$a = [
'name' => 'Tanaka',
'age' => 30,
];
$b = [
'age' => 31,
'email' => 'tanaka@example.com',
];
$result = $a + $b;
print_r($result);
結果です。
Array
(
[name] => Tanaka
[age] => 30
[email] => tanaka@example.com
)
+ 演算子では、同じキーがある場合、左側の配列が優先されます。
| 方法 | 同じキーがある場合 |
|---|---|
array_merge($a, $b) | 後ろの配列が優先される |
$a + $b | 前の配列が優先される |
設定値を上書きしたい場合は、array_merge() を使うことが多いです。
$default = [
'limit' => 10,
'sort' => 'desc',
];
$options = [
'limit' => 20,
];
$config = array_merge($default, $options);
print_r($config);
結果です。
Array
(
[limit] => 20
[sort] => desc
)
配列の並び替え
配列を並び替える関数もよく使います。
sort()
値を昇順に並び替えます。
数値キーは振り直されます。
$numbers = [3, 1, 2];
sort($numbers);
print_r($numbers);
結果です。
Array
(
[0] => 1
[1] => 2
[2] => 3
)
rsort()
値を降順に並び替えます。
数値キーは振り直されます。
$numbers = [3, 1, 2];
rsort($numbers);
print_r($numbers);
結果です。
Array
(
[0] => 3
[1] => 2
[2] => 1
)
asort()
値を昇順に並び替えますが、キーは保持します。
$scores = [
'Tanaka' => 80,
'Sato' => 95,
'Suzuki' => 70,
];
asort($scores);
print_r($scores);
結果です。
Array
(
[Suzuki] => 70
[Tanaka] => 80
[Sato] => 95
)
ksort()
キーを基準に昇順で並び替えます。
$user = [
'name' => 'Tanaka',
'age' => 30,
'email' => 'tanaka@example.com',
];
ksort($user);
print_r($user);
結果です。
Array
(
[age] => 30
[email] => tanaka@example.com
[name] => Tanaka
)
配列とJSONの関係
Web制作やAPI開発では、PHPの配列をJSONに変換することがよくあります。
配列をJSONに変換するには、json_encode() を使います。
$user = [
'name' => 'Tanaka',
'age' => 30,
];
$json = json_encode($user, JSON_UNESCAPED_UNICODE);
echo $json;
結果です。
{"name":"Tanaka","age":30}
JSON文字列をPHPの配列に変換する場合は、json_decode() を使います。
$json = '{"name":"Tanaka","age":30}';
$user = json_decode($json, true);
echo $user['name']; // Tanaka
第2引数に true を指定すると、オブジェクトではなく連想配列として取得できます。
リストと連想配列ではJSONの形が変わる
リストをJSONに変換すると、JSON配列になります。
$list = ['apple', 'banana', 'orange'];
echo json_encode($list, JSON_UNESCAPED_UNICODE);
結果です。
["apple","banana","orange"]
一方、連想配列をJSONに変換すると、JSONオブジェクトになります。
$user = [
'name' => 'Tanaka',
'age' => 30,
];
echo json_encode($user, JSON_UNESCAPED_UNICODE);
結果です。
{"name":"Tanaka","age":30}
ここで注意したいのが、数値キーが途中で抜けた配列です。
$list = ['apple', 'banana', 'orange'];
unset($list[1]);
echo json_encode($list, JSON_UNESCAPED_UNICODE);
この場合、JSON配列ではなく、JSONオブジェクトのように出力されることがあります。
{"0":"apple","2":"orange"}
APIレスポンスなどでJSON配列として返したい場合は、array_values() でキーを振り直してから json_encode() します。
$list = array_values($list);
echo json_encode($list, JSON_UNESCAPED_UNICODE);
結果です。
["apple","orange"]
これは実務でも非常に重要なポイントです。
WordPressでよく見る配列の例
WordPressでは、PHPの配列を非常によく使います。
たとえば、WP_Query では条件を連想配列で指定します。
$args = [
'post_type' => 'post',
'posts_per_page' => 5,
'category_name' => 'news',
];
$query = new WP_Query($args);
この $args は、設定項目をキーとして持つ連想配列です。
'post_type' => 'post'
'posts_per_page' => 5
'category_name' => 'news'
また、記事一覧の表示データを配列で管理することもあります。
$posts = [
[
'title' => 'SEOの基本',
'url' => '/seo-basic/',
],
[
'title' => '広告運用の始め方',
'url' => '/ad-basic/',
],
[
'title' => 'GA4レポートの見方',
'url' => '/ga4-report/',
],
];
この場合、$posts はリストです。
その中に、1記事分の情報を表す連想配列が入っています。
HTMLに出力する場合は、次のように書けます。
<?php foreach ($posts as $post): ?>
<article>
<h2>
<a href="<?php echo esc_url($post['url']); ?>">
<?php echo esc_html($post['title']); ?>
</a>
</h2>
</article>
<?php endforeach; ?>
WordPressでは、通常の htmlspecialchars() ではなく、出力する場所に応じて esc_html()、esc_url()、esc_attr() などを使うことが多いです。
実務での使い分け
PHPの配列は柔軟ですが、使い方を整理しておくとコードが分かりやすくなります。
単なる一覧ならリスト
タグ、ID、カテゴリ名など、単純な一覧を扱う場合はリストが向いています。
$tags = ['SEO', '広告運用', 'アクセス解析'];
$postIds = [12, 35, 48];
1件分のデータなら連想配列
ユーザー1人、記事1件、商品1件のようなデータは連想配列で表すと分かりやすいです。
$article = [
'title' => 'SEOの基本',
'category' => 'マーケティング',
'published_at' => '2026-05-03',
];
複数件のデータなら多次元配列
複数の記事や複数の商品を扱う場合は、リストの中に連想配列を入れる形にします。
$articles = [
[
'title' => 'SEOの基本',
'category' => 'マーケティング',
],
[
'title' => '広告運用の始め方',
'category' => '広告',
],
];
この構造は、記事一覧、商品一覧、スタッフ一覧、FAQ一覧などでよく使われます。
よくあるミス
キー名のクォートを忘れる
連想配列の文字列キーは、基本的にクォートで囲みます。
$user = [
'name' => 'Tanaka',
];
次のような書き方は避けましょう。
$user = [
name => 'Tanaka',
];
意図しないエラーや警告につながる可能性があります。
存在しないキーを参照する
echo $user['email'];
email キーが存在しない場合、警告が出ることがあります。
安全に書くなら、次のようにします。
echo $user['email'] ?? '';
または、初期値を指定します。
$email = $user['email'] ?? '未登録';
array_filter() のあとにキーが飛ぶ
array_filter() はキーを保持します。
$numbers = [1, 2, 3, 4];
$even = array_filter($numbers, fn($n) => $n % 2 === 0);
print_r($even);
結果です。
Array
(
[1] => 2
[3] => 4
)
リストとして使いたい場合は、array_values() を使います。
$even = array_values($even);
array_search() の戻り値をゆるく判定する
$key = array_search('apple', $fruits, true);
if ($key) {
echo '見つかりました';
}
この書き方は危険です。
apple が 0 番目にある場合、$key は 0 になり、条件が成立しません。
正しくは、次のように書きます。
if ($key !== false) {
echo '見つかりました';
}
in_array() で厳密比較をしない
in_array('1', [1, 2, 3]);
この場合、型変換によって true になることがあります。
意図しない一致を避けるなら、次のように第3引数に true を指定します。
in_array('1', [1, 2, 3], true);
配列の型指定
PHPでは、関数の引数や戻り値に array 型を指定できます。
function getFruits(): array
{
return ['apple', 'banana', 'orange'];
}
引数にも指定できます。
function showFruits(array $fruits): void
{
foreach ($fruits as $fruit) {
echo $fruit . PHP_EOL;
}
}
ただし、PHPの型指定だけでは、配列の中身までは細かく指定できません。
たとえば、次のような情報は array 型だけでは表現しきれません。
// 文字列の配列
// 整数の配列
// nameとageを持つ連想配列
そのため、実務ではPHPDocを使って補足することがあります。
/**
* @param string[] $fruits
*/
function showFruits(array $fruits): void
{
foreach ($fruits as $fruit) {
echo $fruit . PHP_EOL;
}
}
連想配列の構造を示す場合は、次のように書くこともあります。
/**
* @param array{name: string, age: int} $user
*/
function showUser(array $user): void
{
echo $user['name'];
}
PHPStanやPsalmなどの静的解析ツールを使う場合、このようなPHPDocが役立ちます。
配列とオブジェクトの使い分け
PHPでは、簡単なデータであれば配列で十分です。
$user = [
'name' => 'Tanaka',
'age' => 30,
];
ただし、構造が固定されている重要なデータや、データに関連する処理を持たせたい場合は、オブジェクトを使ったほうがよいこともあります。
class User
{
public function __construct(
public string $name,
public int $age,
) {}
}
$user = new User('Tanaka', 30);
echo $user->name;
使い分けの目安は次の通りです。
| 用途 | 向いているもの |
|---|---|
| 簡単な設定値 | 連想配列 |
| 値の一覧 | リスト |
| APIレスポンスの整形 | 配列 |
| 一時的な表示用データ | 配列 |
| 構造が固定された重要データ | オブジェクト |
| データに処理を持たせたい場合 | オブジェクト |
WordPressのテーマ制作では配列を使う場面が多いです。
一方、Laravelなどのアプリケーション開発では、配列だけでなく、オブジェクトやコレクションもよく使われます。
まとめ
PHPの配列は、単なる値の一覧ではありません。
キーと値のペアを順序付きで保持する柔軟なデータ構造です。
PHPでは、リストも連想配列も多次元配列も、基本的にはすべて array 型で表現されます。
重要なポイントを整理すると、次の通りです。
| 用語 | 意味 |
|---|---|
| 配列 | PHPの array 型全般 |
| リスト | 0 から始まる連続した整数キーを持つ配列 |
| 連想配列 | 文字列キーなど、意味のあるキーで値を管理する配列 |
| 多次元配列 | 配列の中に配列が入っているもの |
list() | 配列の値を複数の変数に分解代入する構文 |
array_is_list() | 配列がリスト形式か判定する関数 |
まずは、次の3つをしっかり区別すると理解しやすくなります。
// リスト
$fruits = ['apple', 'banana', 'orange'];
// 連想配列
$user = [
'name' => 'Tanaka',
'age' => 30,
];
// 多次元配列
$users = [
[
'name' => 'Tanaka',
'age' => 30,
],
[
'name' => 'Sato',
'age' => 25,
],
];
PHPの配列で特に大切なのは、値だけでなくキーを見ることです。
見た目は普通の配列に見えても、キーが途中で抜けているとリストではなくなります。
unset() や array_filter() のあとにJSON化する場合などは、array_values() でキーを振り直すかどうかを意識しましょう。
$items = ['a', 'b', 'c'];
unset($items[1]);
var_dump(array_is_list($items)); // false
$items = array_values($items);
var_dump(array_is_list($items)); // true
PHPの配列は非常に便利ですが、そのぶん挙動も柔軟です。
「これはリストなのか」「キーは連続しているのか」「連想配列として扱うべきなのか」を意識すると、実務でも安全で読みやすいコードを書きやすくなります。
PHPの配列とリストについてでした。
最後までお読みいただき、ありがとうございました。










