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

松嶋祥文 php-users@php.gr.jp
Tue, 31 Jul 2001 17:55:52 +0900


松嶋@ITBoost です。
こんにちわ。

| 配列から要素を取り除きたいのですが、スマートな方法がわかりません。
| 現在は、取り除きたい要素以外をすべてコピーするという方法を用いています。

PHP3 の場合は、組み込み関数一発というのは無いんじゃない
かとおもいます。私は思いつきませんでした。

ということで、メモリを節約したい(配列をコピーしたくない)
というのに重点を置いた関数を作成してみました。

配列(へのリファレンス)と削除したい要素の番号を渡します。
配列内で順番が変わっても良い場合と、ダメな場合の両方の
関数を挙げておきます。

あんまりスマートではないですが、PHP 内部のデータを直接
いじれない以上、論理的にこういうことをしないとダメなの
で仕方がないのではないかと思います。参考程度にどうぞ。

# こんなんで良かったでしょうか?

<?

// 順番が変わっても良いならこっち。
// (この場合連想配列にするという手もありでしょう)

function
removeElement(&$arr, $elem) {

  if( count($arr) <= $elem || !count($arr) ) {
    return false;
  }

  end($arr);
  $arr[$elem] = current($arr);
  unset($arr[count($arr)-1]);
  return true;
}


// 順番がかわっちゃいけないならこっち。

function
removeElement2(&$arr, $elem) {
  if( count($arr) <= $elem || !count($arr) ) {
    return false;
  }

  for($i=$elem; $i<count($arr)-1; $i++) {
    $arr[$i] = $arr[$i+1];
  }

  unset($arr[count($arr)-1]);
  return true;
}

$arr = array("e0", "e1", "e2", "e3", "e4", "e5");

print "Size: " . count($arr) . "\n";
if( removeElement($arr, 2) ) {
  print join(",", $arr) . "\n";
}
print "Size: " . count($arr) . "\n";

?>


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