[PHP-users 19383]Re: [1]から始まる多次元配列

Osamu Shigematsu m5issige @ mr.hitachi-medical.co.jp
2003年 12月 17日 (水) 09:17:38 JST


重松です。こんにちは。

> 1次元配列の場合は、[1]から始める方法があるのですが、
> 2次元配列の場合はどのようにすればよろしいのでしょうか?
> また、結果として2次元配列が生成されるのですが、生成方法
> に問題(より良い方法)は無いでしょうか?

私も最初に PHP を使ったときに、「配列」という言葉にだまされましたが、
PHP が配列といっているものは、一般的には連想配列 (C++ STL だと std::map)
といわれているもので、いわゆる配列 (std::vector) とは挙動が異なります。

アクセスする際に使用するインデックスのように見える数字は、
実は数字ではなくて単なるキーなので、

$a = array(1 => '1', 2 => '2', 5 => 5);
var_dump($a); // すでに、この時点で、4 が抜けている
unset($a[1]);
var_dump($a); // インデックスではないので、番号の振りなおしはない

というようなことが起こります。

繰り返しますが、PHP の配列は、連想配列で、配列ではないです。

当然ですが、2 次配列などというものは存在しません。
単に 1 次配列に、別の 1 次配列が入れ子になっているだけです。

あえて、配列として格納された順にアクセスする場合には、
foreach 構文、もしくは、reset(), each() 関数などを使います。
一応、昇順 (?) になり、降順でもアクセスできます。
# ただし、降順はキーに 0 などがあると、都合が悪いようです。

ランダムに n 番目の要素にアクセスする方法は私は知りません。
# あったら教えてください。 m(__)m

> 最初に配列の定義「$ary = array();」をする必要がない方法
> はあるのでしょう?

必要ない方法はないのでは?

当然ですが、まだ、$a が使用されてないなら、いきなり、

$a['キー'] = '値';

とするとこで、値を設定することができます。

ただし、$a が未使用であることが前提であり、例えば、文字列となっている
場合、添え字が n 文字目とみなされて、置換操作をします。

$a = "abc";
$a[1] = 1;
var_dump($a);

string(3) "a1c"

それ以外の配列以外だと、以前の値が優先されて、勝手に配列にはならないと
思います。

unset($a) とするくらいなら、意味が明確な $a = array(); がスマートと
私は思います。

-- 
Osamu Shigematsu <m5issige @ mr.hitachi-medical.co.jp>



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