phpでは、

  • いわゆる普通の配列(インデックスが0,1,2,3,...と続くやつ)と、
  • 連想配列(他の言語ではハッシュマップとかハッシュテーブルとか呼ぶやつ)の

区別がありません。

全てのarrayは、integerかstringをインデックスとした連想配列であり、「いわゆる普通の配列」は連想配列の特殊なケース、という扱いです。

php > $vector = ['apple', 'orange', 'banana'];
php > $map = ['apple'=>'red', 'orange'=>'orrange', 'banana'=>'yellow'];
php > $mix = ['apple', 'apple'=>'red', 'orange', 9=>'lemon'];
php > var_export($mix);
array (
  0 => 'apple',
  'apple' => 'red',
  1 => 'orange',
  9 => 'lemon',
)
php > // 3つとも全部、array
php > echo is_array($vector) && is_array($map) && is_array($mix);
1
php > 

プログラマー同士で会話するときに、「いわゆる普通の配列」とか、「連想配列じゃない方」とか言うのは不便なのですが、あんまり良い呼び名がありません。

一応、公式サイトでは「添字配列」という表現を見かけますが、個人的には現場で耳にしたことは無いです。英語でも、numerical arrayとか、indexed arrayとか、array with indicesって感じで揺れてます。


「いわゆる普通の配列」とは言え、他の言語のプログラマーから見ると「普通でない」挙動を見せることがあります。「インデックスの欠番を許す」という点です。

php > $wat = array_filter($vector, function($f){return $f == 'orange';});
php > echo count($wat);
1
php > echo $wat[0];

Notice: Undefined offset: 0 in php shell code on line 1
php > // ↑WAT!?
php > var_export($wat);
array (
  1 => 'orange',
)
php > 

インデックスを詰めてくれない……。


ところで、php7.4からは、ES6でお馴染みのfat arrow functionが使えるようになったんですね。上記のarray_filter()は、↓のようにも書けます。

php > $wat = array_filter($vector, fn($f)=>$f=='orange');

ただし、ラムダのボディに書けるのは「式ひとつだけ」です。その式の評価結果がreturnされます。そして嬉しいことに、fat arrowを使ってクロージャを書くときは、useが不要です。夢のようです。