PHPの配列とリストについて

採用はこちら

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

表で見ると、次のようなイメージです。

インデックスnameage
0Tanaka30
1Sato25
2Suzuki28

実務では、データベースから取得した一覧データ、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()truefalse
array_key_exists()truetrue

使い分けとしては、次のように考えるとよいです。

// 値が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'0nullfalse などを空と判定します。

配列であることが分かっている場合には便利ですが、値の種類が曖昧な場合は注意しましょう。

配列から値を削除する

配列の要素を削除するときは、unset() を使います。

$fruits = ['apple', 'banana', 'orange'];

unset($fruits[1]);

print_r($fruits);

結果は次のようになります。

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

ここで重要なのは、unset() で削除しても、キーは自動的に詰め直されないという点です。

この配列は、キーが 02 になっています。

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 '見つかりました';
}

この書き方は危険です。

apple0 番目にある場合、$key0 になり、条件が成立しません。

正しくは、次のように書きます。

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の配列とリストについてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次