Java経験者がPHPでハマる10選の4 「配列の概念の違い」

こんにちは。ゆうせいです。

Javaをしっかり学んだ人がPHPに移行すると、「似てるはずなのに全然感覚が違う!」と驚くことが多いんです。
同じオブジェクト指向言語ですが、設計思想や実行環境、型の扱い方などがかなり異なります。
Java経験者がPHPを学ぶときにハマりやすいポイントを10個にまとめ、具体的な解説と回避方法をお伝えしています。

今回は、4つ目「配列の概念の違い」を掘り下げます。


配列の概念の違い

JavaとPHPでは「配列(array)」という同じ単語を使っていても、中身の正体と性質がまったく違うため、移行時にかなり混乱します。

Java経験者は配列といえば「固定長・同一型・順序保証あり」というイメージを持ちますが、PHPの配列はもっと自由で、連想配列(ハッシュテーブル)+順序付きリストのハイブリッド構造です。


JavaとPHPの配列比較

項目JavaPHP
長さ固定(再代入不可)可変(自由に追加・削除可能)
同一型のみ型混在OK
インデックス0から始まる整数整数キーまたは文字列キー(混在可能)
順序保証される基本的に保持されるが、キーの扱いで変化
実体メモリ上の連続領域連想配列(ハッシュテーブル)

サンプルコード

Java

int[] nums = {1, 2, 3};
System.out.println(nums[0]); // 1
nums[3] = 4; // コンパイルエラー(範囲外)

PHP(数値キー)

$arr = [1, 2, 3];
echo $arr[0]; // 1
$arr[] = 4;   // 配列末尾に追加

PHP(文字キー)

$user = ["name" => "Yamada", "age" => 20];
echo $user["name"]; // Yamada


混在も可能(PHPの自由度)

$mixed = [
    0 => "apple",
    "color" => "red",
    2 => 100
];

こういう構造はJavaの配列には存在しません。JavaでやるならMapListを使う必要があります。


ハマりポイント1:キーの自動再採番

PHPで数値キー配列に要素を削除すると、キーは詰められません。

$arr = [10, 20, 30];
unset($arr[1]);
print_r($arr);
// Array ( [0] => 10 [2] => 30 )

Java脳だと「[0]=10, [1]=30になるはず」と思ってしまう。


ハマりポイント2:ソート時の挙動

キー付き配列をsort()すると、キーが全部リセットされます。

$assoc = ["b" => 2, "a" => 1];
sort($assoc);
print_r($assoc);
// Array ( [0] => 1 [1] => 2 )


イメージで理解する

  • Javaの配列:同じ形の箱が順番に並んだ棚(番号順でしかアクセスできない)
  • PHPの配列:棚だけど、棚ごとにラベル(キー)が自由につけられ、ラベルは数字でも文字でもOK

実務での推奨

  1. 数値キー配列(順序リスト)か文字キー配列(連想配列)かを明確に使い分ける
  2. 複雑な構造ならarrayよりSplFixedArrayArrayObject、あるいはstdClassを検討
  3. JSONとの変換を多用する場合はキーの型に注意する

「Javaは整列棚、PHPは自由ラベル棚」というイメージで一瞬で理解できますね。

次は5つ目「例外処理の違い」に進めると、エラー発生時の思想の違いが見えてきます。

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。