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プログラミング入門
関連記事
コメントを残す