[PHP-users 16885]array_mergeで配列を結合した時のインデックスついて

荻原 宣之 ogihara @ itup.co.jp
2003年 7月 22日 (火) 11:02:30 JST


こんにちは
荻原と申します。

array_mergeについて質問させていただきます。

例えば下記のように

$hoge1["a"] = "a";
$hoge1["b"] = "b";
$hoge2[1]   = 1;
$hoge2[2]   = 2;
$hoge2[3]   = 3;
$hoge3 = array_merge($hoge1, $hoge2);

とした場合、$hoge1のインデックスはそのままの「"a"」、「"b"」となっている
のですが、$hoge2の配列のインデックスは「1」が「0」、「2」が「1」、「3」が
「2」
にそれぞれ変わってしまいます。
下記はvar_dump関数で中身を表示させたものです。

array(5) { ["a"]=> string(1) "a" ["b"]=> string(1) "b" [0]=> int(1) [1]=>
int(2) [2]=> int(3) }


これを見る限り、どうもインデックスが数値の場合は自動的に連番を
振り直されるようです。
試しに

$hoge1["a"]  = "a";
$hoge1["b"]  = "b";
$hoge2["01"] = 1;
$hoge2["02"] = 2;
$hoge2["03"] = 3;
$hoge3 = array_merge($hoge1, $hoge2);

としたものを、var_dump関数で表示させると

array(5) { ["a"]=> string(1) "a" ["b"]=> string(1) "b" ["01"]=> int(1)
["02"]=> int(2) ["03"]=> int(3) }

となり、

$hoge1[5] = 5;
$hoge1[6] = 6;
$hoge2[1] = 1;
$hoge2[2] = 2;
$hoge2[3] = 3;
$hoge3 = array_merge($hoge1, $hoge2);

としたものを、var_dump関数で表示させると

array(5) { [0]=> int(5) [1]=> int(6) [2]=> int(1) [3]=> int(2) [4]=>
int(3) }

となりました。


やはり数値の場合のみ、指定した引数の前の方から順番に、自動的に
連番に変換されるようです。
これは仕様なのでしょうか?
もし、どうしてもインデックスが数値のものもそのまま使いたい場合には
自分で作るしかないのでしょうか?

なぜこのようなことになるのかお分かりの方がおられましたら
教えていただけないでしょうか。


また、

$hoge["1"] = 1;
$hoge["2"] = 1;

としたものを、var_dump関数で表示させると

array(2) { [1]=> int(1) [2]=> int(1) }

となりました。
この場合は、インデックスはダブルクォーテーションがないので数値に
なっているようです。
よって、

$hoge["1"] = 1;
$hoge[1]   = 2;

としたものを、var_dumpで表示させると

array(1) { [1]=> int(2) }

となります。
配列のインデックスは数字の場合、数値に変換されるようなのですが
数値と数字を区別することはできないのでしょうか?

申し訳ございませんが、おわかりの方がおられましたら、これも合わせて
お答えいただけないでしょうか。


下記は、サーバ情報です。

OS:Red Hat Linux 7.3
PHPのバージョン:4.3.1


以上、何卒宜しくお願い致します。



PHP-users メーリングリストの案内