PHP配列トリビア 配列の正体は辞書
忘れそうなのでメモ。
格納順序が不自然で、インデックスは連続している配列があるとする。
<?php $a = array(0,1,2); $a[5] = 5; $a[4] = 4; $a[3] = 3; print_r($a); ?>
Array
(
[0] => 0
[1] => 1
[2] => 2
[5] => 5
[4] => 4
[3] => 3
)foreachでは格納順に処理される。
<?php foreach($a as $i=>$e){ echo "[" . $i . "]=". $e . " "; } echo "\n"; ?>
[0]=0 [1]=1 [2]=2 [5]=5 [4]=4 [3]=3
正しいインデックス順処理?
<?php $ak = array_keys($a); natsort($ak); foreach($ak as $i){ echo "[" . $i . "]=". $a[$i] . " "; } echo "\n"; ?>
[0]=0 [1]=1 [2]=2 [3]=3 [4]=4 [5]=5
歯抜けキーなしの場合はこれでもいい
<?php for($i = 0; $i < count($a); $i++){ echo "[" . $i . "]=". $a[$i] . " "; } echo "\n"; ?>
[0]=0 [1]=1 [2]=2 [3]=3 [4]=4 [5]=5
array_pushの実装
0と自然数キーのみの集合のうちで最大の値に1加算したキーと値を末尾に格納
<?php $b = $a; array_push($b, 99); print_r($b); ?>
Array
(
[0] => 0
[1] => 1
[2] => 2
[5] => 5
[4] => 4
[3] => 3
[6] => 99
)array_popの実装
格納順で最後の要素を取り出す
<?php $b = $a; echo array_pop($b) . "\n"; print_r($b); ?>
3
Array
(
[0] => 0
[1] => 1
[2] => 2
[5] => 5
[4] => 4
)array_unshiftの実装
まずキー0に値を格納し、既存要素を格納順に連続値で再インデックスする
<?php $b = $a; array_unshift($b, 99); print_r($b); ?>
Array
(
[0] => 99
[1] => 0
[2] => 1
[3] => 2
[4] => 5
[5] => 4
[6] => 3
)array_shiftの実装
格納順で最初の要素を取り出し、他を格納順に連続値で再インデックスする
<?php $b = $a; echo array_shift($b) . "\n"; print_r($b); ?>
0
Array
(
[0] => 1
[1] => 2
[2] => 5
[3] => 4
[4] => 3
)というわけで、使う前にksortをかけて、順不同で格納された歯抜けなし配列を、foreachやarray_シリーズが期待する正常な形式の配列に変換する。
<?php $b = $a; ksort($b); print_r($b); ?>
Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
)