2012年5月25日金曜日

php配列の足し算。array_mergeと+演算子による結合

いつも忘れる。php-5.3.13で確認。

array_merge($a, $b)

・$a, $bに同じキーが合った場合、キーが文字列なら上書き
・添字(数値*1)なら、キーを振りなおし。
※第1引数のはじめの添字の要素から順に0, 1, 2と振り直される。
※文字列のキーと混合してた場合、キー文字列の要素はキーも配列内の位置もそのまま変わらない
・もし引数のうち1つでも配列でないものがあるとWarningが発生する。(処理は止まらない)
※引数が配列か不明なときは(array)でキャストするのが良い。
// 例

var_dump(array_merge(array(1 => 'a', 2, 'b' =>'hoge'), array(10, 20, 'b' => 'fuga')));
// -> array(0=>'a', 1=>2, 'b'=>'fuga', 2=>10, 3=>20)
// ※すべての引数をまとめて一括で添字のキーが完全に0から振り直される


// ちなみにphpはキーにfloatやintとして成り立つ文字列を使うとintにキャストされる。
var_dump(array(1.2=>1, '3' => 2));
// → array(1=>1, 3=>2);

// ただし”intとして成り立つ文字列”なので、floatに見えるものはキャストされず文字列のキーとなる
var_dump(array('1.2'=>1, '3' => 2));
// → array('1.2'=>1, 3=>2);


$a + $b (配列の足し算)

・$a, $bに同じキーがあった場合、先の要素がイキになり、あとの要素は破棄される
・もし引数のうち1つでも配列でないものがあると、Fatal Errorが発生し、処理が止まる。
※同じく(array)でキャストするのが無難。
// 例
var_dump(array(1 => 'a', 2, 'b' =>'hoge') + array(10, 20, 'b' => 'fuga', 100=>1, 2));
// → array(1=>'a', 2=>2, 'b'=>'hoge', 0=>10, 100=>1, 101=>2);
// 100=>1, 101=>2の部分は配列の宣言仕様に従いある要素にintの添字が振られていた場合はその要素以降その添字からインクリメントしてく。

よってphpの配列を使うときは
・添字配列と文字列キー配列(連想配列)を混合させない。
・より直感的に使えそうな結合方法は+演算子よりもarray_merge