読者です 読者をやめる 読者になる 読者になる

六帖のかたすみ

DVを受けていた男性。家を脱出して二周目の人生を生きています。自閉症スペクトラム(受動型)です。http://rokujo.org/ に引っ越しました。

PHPイミフ仕様2 連想配列に順序がある

<?php
$kencho = array(
'神奈川県' => "横浜市",
'埼玉県' => "さいたま市",
'千葉県' => "千葉市",
'茨城県' => "水戸市",
'静岡県' => "静岡市"
'山梨県' => "甲府市"
);
$removed = array_splice($kencho, 2, 2); // 千葉、茨城が消える
$tokyo = array('東京都' => "新宿区");
array_splice($kencho, 1, 0, $tokyo); // 神奈川と埼玉の間に東京が入る
?>

連想配列の順序が保障されている。こんなことはPHPだけで許される。例えばpython連想配列に順序はない。printで配列の中身を見ると、参照するたびに順番が変わる。javascirptでもそう。for-in構文を使うと順番が環境や状況によって変わる。

PHPは通常の配列も数値インデックスを持つ連想配列と同様に扱われる。例えば数値と連想配列の混合が可能なことからもわかる。

<?php
$kencho = array(
'神奈川県' => "横浜市",
'埼玉県' => "さいたま市",
'千葉県' => "千葉市",
);
var_dump($kencho);
$suuji = array(14, 11, 12);
var_dump($suuji);
$merge = array_merge($kencho, $suuji);
var_dump($merge);
?>

実行結果

array (size=6)
'神奈川県' => string '横浜市' (length=9)
'埼玉県' => string 'さいたま市' (length=15)
'千葉県' => string '千葉市' (length=9)


array (size=3)
0 => int 14
1 => int 11
2 => int 12


array (size=9)
'神奈川県' => string '横浜市' (length=9)
'埼玉県' => string 'さいたま市' (length=15)
'千葉県' => string '千葉市' (length=9)
0 => int 14
1 => int 11
2 => int 12

PHP: 配列 - Manual
マニュアルによると、「PHP の配列は、実際には順番付けられたマップです。」と書いてある。順番があるということは、PHPの配列は内部では次のように処理されているということらしい。

インデックス:0 キー:神奈川県 値:横浜市
インデックス:1 キー:埼玉県 値:さいたま市
インデックス:2 キー:千葉県 値:千葉市
インデックス:3 キー:0 値:14
インデックス:4 キー:1 値:11
インデックス:5 キー:2 値:12

順序があることでやりやすくなる処理もあるかもしれない。が、基本的に連想配列は順序が無いものとして扱った方が無難だろう。大多数の言語ではそうではないのだから。