[PHP]配列内から、index指定で要素を削除する方法

PHPで配列から要素を削除するには、array_shift(),array_pop(),unset()関数を使用します。
それぞれ配列の「先頭、末尾、index指定」で要素を削除することが出来ます。
index指定というのは、配列の要素番号を指定するという意味です。

それぞれの関数は、以下のサンプルコードで振る舞いを確認できます。

// 先頭を削除
echo "case1----\n";
$dataList = array( "d1", "d2", "d3", "d4", "d5" );
array_shift( $dataList );
var_dump( $dataList );
 
// 末尾を削除
echo "case2----\n";
$dataList = array( "d1", "d2", "d3", "d4", "d5" );
array_pop( $dataList );
var_dump( $dataList );
 
// 2個目の要素を削除
echo "case3----\n";
$dataList = array( "d1", "d2", "d3", "d4", "d5" );
unset( $dataList[1] );
var_dump( $dataList );



実行結果:

case1----
array(4) {
  [0]=>
  string(2) "d2"
  [1]=>
  string(2) "d3"
  [2]=>
  string(2) "d4"
  [3]=>
  string(2) "d5"
}
 
case2----
array(4) {
  [0]=>
  string(2) "d1"
  [1]=>
  string(2) "d2"
  [2]=>
  string(2) "d3"
  [3]=>
  string(2) "d4"
}
 
case3----
array(4) {
  [0]=>
  string(2) "d1"
  [2]=>
  string(2) "d3"
  [3]=>
  string(2) "d4"
  [4]=>
  string(2) "d5"
}



それぞれ意図する場所のデータが削除できました。


先頭、末尾の削除は特に問題ないのですが、case3は、indexの振られ方に注意が必要です。
データの2番目を削除してもd3が$dataList[1]に入らず,$dataList[1]は欠番になります。
これはPHPの配列が内部的に連想配列(ハッシュ)として実装されているからです。

配列のindexもずらしたい場合は、以下のコードで(一応)代替することは可能です。

// $dataList[2]を削除して、配列indexをスライドさせる
echo "case4----\n";
$dataList = array( "d1", "d2", "d3", "d4", "d5" );
$delIndex = 2;
$dataList = array_merge( array_slice( $dataList, 0,           $delIndex                    ),
                         array_slice( $dataList, $delIndex+1, count($dataList) - $delIndex ) );
var_dump( $dataList );



実行結果

case4----
array(4) {
  [0]=>
  string(2) "d1"
  [1]=>
  string(2) "d2"
  [2]=>
  string(2) "d4"
  [3]=>
  string(2) "d5"
}



このコードでは、array_slice()で部分配列を求めた後、array_merge()で再度結合を行っています。


…ですが、処理内容から容易に推測かと思いますが、このコードは実行コストが高い(非常に時間が掛かる)のでお勧めしません。

そもそも順序付けられたデータの集まりから、任意の要素を指定してデータを頻繁に削除する場合、配列にデータを格納するのは、データ操作に時間が掛かる為お徳では有りません。

一般的に、このような場合はリンクリストの利用を検討します。
PHP5.3以降では、データ構造として双方向リンクリストである、SplDoublyLinkedListクラスが用意されているので、このクラスを使用したほうが良いかもしれません。





ちなみに、連想配列の場合,key指定で削除する場合は、以下の様な感じでOKです。
キーが文字列なハッシュの場合は、”ずらす”という概念がそもそも無いので簡単ですね。

unset( $dataList[ 'keyValue1' );




プロになるための PHPプログラミング入門

関連記事

コメントを残す

メールアドレスが公開されることはありません。