phpの「連想配列じゃない方」を何と呼ぶ?
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
が不要です。夢のようです。