JavaScriptとPHPの「配列」の違い:実は役割がちょっと違う!
普段、JavascriptやTypescriptを使って開発している私が、PHPの配列の仕様の違いに少しつまづいたことをきっかけに記事を書きました
JavaScriptとPHP、どちらもWeb開発でよく使われる言語ですが、似ているようで少し違う部分もあります。特に「配列」の扱いは、初学者の方が混乱しやすいポイントかもしれません。
この記事では、JavaScriptの配列(Array)とPHPの配列(array)の根本的な違いについて、サンプルコードを交えながら解説します。
結論:役割が違う
ざっくり言うと、両者の「配列」が持つ役割が異なります。
-
JavaScript:
Arrayは 順序付けられたリスト。連想配列的な役割はObjectが担う。 -
PHP:
arrayは 順序付けられたリスト と 連想配列(マップ) の 両方 の役割を兼ね備える。
では、具体的に見ていきましょう。
1. JavaScript の配列 (Array)
JavaScriptの配列は、順序付けられた値のリスト を表現するためのデータ構造です。要素へのアクセスには、0から始まる数値インデックス を使用します。
// JavaScript の配列 (Array)
const colors = ['Red', 'Green', 'Blue'];
// インデックスでアクセス
console.log(colors[0]); // 出力: Red
console.log(colors[1]); // 出力: Green
// 配列の長さ
console.log(colors.length); // 出力: 3
もし、'colorName' のような 文字列キー で値(例: '#FF0000')を管理したい場合、JavaScriptでは配列ではなく オブジェクト (Object) を使うのが一般的です。
// JavaScript のオブジェクト (Object) - 連想配列の代わり
const colorCodes = {
Red: '#FF0000',
Green: '#00FF00',
Blue: '#0000FF'
};
// 文字列キーでアクセス
console.log(colorCodes.Green); // 出力: #00FF00
console.log(colorCodes['Blue']); // 出力: #0000FF
JavaScriptのポイント:
-
Arrayは主に 数値インデックス で要素を管理するリスト。 -
文字列キー で値を管理したい場合は
Objectを使う。(役割分担がされている)
2. PHP の配列 (array)
PHPの配列は非常に柔軟で、「順序付けられたリスト」 と 「連想配列(マップ)」 の両方の機能を 一つの array 型で 実現します。
これにより、数値キー も 文字列キー も、同じ配列の中で扱うことができます。
<?php
// PHP: 数値インデックスの配列(リスト)
$colors = ['Red', 'Green', 'Blue'];
// インデックスでアクセス
echo $colors[0]; // 出力: Red
echo $colors[1]; // 出力: Green
echo "\n---\n";
// PHP: 文字列キーの配列(連想配列)
$colorCodes = [
'Red' => '#FF0000',
'Green' => '#00FF00',
'Blue' => '#0000FF'
];
// 文字列キーでアクセス
echo $colorCodes['Green']; // 出力: #00FF00
echo $colorCodes['Blue']; // 出力: #0000FF
echo "\n---\n";
// PHP: 数値キーと文字列キーの混在も可能
$mixedArray = [
0 => 'Apple', // 数値キー
'fruit' => 'Banana', // 文字列キー
1 => 'Cherry', // 数値キー
'color' => 'Red' // 文字列キー
];
echo $mixedArray[0]; // 出力: Apple
echo $mixedArray['fruit']; // 出力: Banana
echo $mixedArray[1]; // 出力: Cherry
echo $mixedArray['color']; // 出力: Red
?>
PHPのポイント:
-
array型一つで、数値キー も 文字列キー も扱える。 - リスト構造も連想配列構造も、同じ
arrayで表現できる。 - キーの混在も可能。
(余談) JavaScriptにおける Map オブジェクト
ここまでの説明では、JavaScriptで文字列キーを使う場合、主に Object を使うと説明しました。これは伝統的で一般的な方法ですが、ES2015 (ES6) 以降のJavaScriptには Map オブジェクトという、キーと値のペアを扱うためのより専用のデータ構造も用意されています。
Map は、キーとして 文字列だけでなく、任意の型の値 (オブジェクト、数値、真偽値など) を使用できる点が Object との大きな違いです。また、要素の順序が保持されたり、サイズを簡単に取得できたり (size プロパティ)、キー/値の操作に適したメソッド (set(), get(), has(), delete()) が用意されていたりするメリットがあります。
// JavaScript の Map オブジェクト
const userMap = new Map();
// set(キー, 値) で要素を追加
userMap.set('name', 'Alice');
userMap.set('age', 30);
userMap.set(true, 'isAdmin'); // キーに boolean も使える!
userMap.set({id: 1}, 'admin'); // キーにオブジェクトも使える!
// get(キー) で値を取得
console.log(userMap.get('name')); // 出力: Alice
console.log(userMap.get(true)); // 出力: isAdmin
// size で要素数を取得
console.log(userMap.size); // 出力: 4
// has(キー) でキーの存在確認
console.log(userMap.has('age')); // 出力: true
// for...of で反復処理 (挿入順)
for (const [key, value] of userMap) {
console.log(key, value);
}
// 出力例:
// name Alice
// age 30
// true isAdmin
// {id: 1} admin
Map を使う利点:
- キーに文字列以外の型も使える。
- キーの挿入順序が保持される。
-
sizeプロパティで要素数を簡単に取得できる。 - キーの追加、取得、削除、存在確認のための専用メソッドがある。
-
Objectのようにプロトタイプチェーン由来の意図しないキーを気にする必要がない。
結論として:
JavaScriptで連想配列のようなキーと値のペアを扱いたい場合、
- 単純なケースやJSONとの互換性を重視する場合は
Object - キーの型が多様だったり、順序保持や専用メソッドの利便性を求める場合は
Map
を選択することが考えられます。
いずれにしても、PHPの array が数値インデックスと文字列キーを 一つの型でシームレスに扱える のに対し、JavaScriptでは用途に応じて Array, Object, Map といった 異なるデータ構造を使い分ける という基本的な考え方に変わりはありません。
まとめ
| 特徴 | JavaScript | PHP |
|---|---|---|
| 基本の役割 | 順序付きリスト (Array) |
順序付きリスト 兼 連想配列 (array) |
| 数値キー |
Array で使用 |
array で使用 |
| 文字列キー |
Object で使用 |
array で使用 |
| データ構造 |
Array と Object を使い分け |
array に集約 |
このように、JavaScriptでは「リスト」と「キーと値のペア(マップ/連想配列)」を Array と Object で明確に使い分けるのに対し、PHPでは array がその両方の役割をこなせる、より柔軟な(あるいは多機能な)データ構造になっています。
この違いを理解しておくと、それぞれの言語でデータを扱う際に、より適切なデータ構造を選択しやすくなります。
Discussion
むしろ php だと 値型 (変数から変数に代入で複製が可能) として 挙動して、 javascript だと 参照型 (変数から変数に代入しても同じインスタンスが共有される)として挙動する のが一番の大きな違いかと思われます。