[PHP-users 1020] Re: 配列から要素を取り除くには

松嶋祥文 php-users@php.gr.jp
Thu, 02 Aug 2001 11:24:53 +0900


松嶋@ITBoost です。
(一部改行位置変更しています)

| 前々から疑問だったのですが、PHP の array では、添え字というよりもキーなんで
| すよね? 

そうかもしれません。

<?
$arr[0] = "a";
$arr[1] = "b";
$arr[2] = "c";
print join(",", $arr);
?>

というプログラムと

<?
$arr[0] = "a";
$arr[2] = "c";
$arr[1] = "b";  
print join(",", $arr);
?>

は結果が異なります。
(代入の順序が異なるだけです)
# Perl で同等のことをすると結果は同じになります。

| そのため、たとえば、今回のようにある要素を削ったとしても、キーは単に
| そのキーの値が削られるだけで、後ろが自動的に詰まるわけではない、ということで
| すよね?

そうだとおもいます。
配列と名のつくもので、要素を削除したときに自動的
に埋めるような実装がされている言語を私は知らない
のですが、PHP の配列は内部的には連想配列と同じ処
理をしているように見えるので、そもそもユーザが意
図する「前後」とか「順番」というものを保証してい
るものではないのかもしれません。下でも書きますが、
あくまでユーザが管理しないといけないようです。

| <?php
| $a = array("a"=>"A","b"=>"B");
| print "\$a[0] => " . $a[0];
| ?>
| のように、配列 $a の最初の要素を表示したいと思ってもできない、ということにな
| りますね。

それはできません。

ちょっとおっしゃっていることとずれるかもしれない
ですが、連想配列においては「最初の要素」や、「前
後」「順番」などという考え方自体を放棄したほうが
無難かと思います。

PHP の each 関数などでは、代入された順にでてくる
ようになっているようですが、いろいろ unsetしたり
追加しているうちに順番が思ったとおりになっていな
いかもしれません。

配列に関しては、通常の言語だと最初の要素や要素の
並び順を処理系が知っているのが普通ですが、PHP の
場合は、先ほどの例で示したように、そうでもないよ
うです。

つまり、ユーザが添え字の番号順に処理するように
明示的に書いてやる必要があるようです。

先ほどの join の例でいうなら、代入の順序が添え字
の番号順にならない可能性がある場合は、join を使
わずに

for($i=0; $i<count($arr); $i++) {
  print $arr[$i];
  if( $i != count($arr)-1 ) { print "," }
}

とする、というようにです。

結論としては、PHP の配列は連想配列と同じだと思う
ようにしようかな、というところですが、断定的・演
繹的なことはソースを見ないと言えません。
すみませんです。

-- 
                                                      ,-------------+
+----------------------------------------------------'              |
| 株式会社 IT Boost / アイティーブースト                            |
| 松嶋 祥文 [ mats@itboost.co.jp ]                                  |
|                                         http://www.itboost.co.jp/ |
|         PHP, Perl, PostgreSQL, Apache, Java 他、いろいろあります。|
+-------------------------------------------------------------------+