PHPのforeachはキーと値が同時に取り出せて便利な構文です。
ただループ途中で連想配列の要素を削除しようとした場合、その削除方法に悩むことがあります。
ということで記憶の整理も兼ねてforeachループ内での要素の削除方法を紹介
foreachループのおさらい
PHPでのforeachはキーと値を同時に取り出すために使われる特殊なループ文です。
基本的には foreach( $配列 as $キー => $要素 ) のような形で使います。
例えば次がキーと値を同時に取り出すコード例
1 2 3 4 5 |
$colors = [ 'R' => '赤', 'G' => '緑', 'B' => '青' ]; foreach( $colors as $key => $color ){ /// 何か処理... } |
こういう風に i とか j とかのインデックス変数を使わずに要素が取り出せるのが便利な所です。
ちなみに次のようにすればキーを省略して要素だけ取り出すことも可能
1 2 3 4 5 |
$colors = [ 'R' => '赤', 'G' => '緑', 'B' => '青' ]; foreach( $colors as $color ){ print_r($color); } |
as のあとにキーではなく要素を直接渡すこともできます。
以上がforeach文の基本的な使い方
それでこのループ内で要素を削除する方法がここでの本題です。
foreach内で要素を削除するには
ではforeachループの中で要素を削除するにはどうすればいいか・・・
ということですがPHPには変数を削除する関数があるのでそれを使います。
それがunset関数というもので、次が公式リファレンスでの説明
void unset ( mixed
$var
[, mixed$...
] )unset() は指定した変数を破棄します。
関数 unset() の内部動作は、 破棄しようとする変数の型に依存します。引用 : PHP : unset - Manual
この説明の通り、消去したい変数を渡すことでその変数を破棄できます。
ループを回しながら要素を削除するにはこの関数を使えばOKです。
そして次がforeach内でunsetを使って特定の要素を削除するコード例
1 2 3 4 5 |
$colors = [ 'R' => '赤', 'G' => '緑', 'B' => '青' ]; foreach( $colors as $key => $color ){ if( $key === 'B' ) unset($colors[$key]); } print_r($colors); |
unset($colors[$key]); のように連想配列の値をキーで指定して渡すだけです。
上の例ならキーが 'B' の要素が削除されるので print_r の出力は次の通り
1 2 3 4 5 |
Array ( [R] => 赤 [G] => 緑 ) |
'B' というキーとそれに結び付けられた '青' という値が消えてることが分かります。
ちなみにforeachに要素を参照渡しして削除することはできないのでそこは注意が必要です。
例えば値を参照渡しして削除する次のコードは期待通りに動きません。
1 2 3 4 5 6 7 |
$colors = [ 'R' => '赤', 'G' => '緑', 'B' => '青' ]; foreach( $colors as $key => &$color ){ if( $key === 'B' ) unset($color); } print_r( $colors ); |
こうすると print_r で出力される連想配列は元のままです。
1 2 3 4 5 6 |
Array ( [R] => 赤 [G] => 緑 [B] => 青 ) |
こっちの方がスマートだし上手くいきそうな気がしますが、無理なんですよね・・・
そこはunset関数の仕様的にできないので諦めるしかありません。
多少長くなって面倒でも unset( $連想配列[$キー] ); と書く必要があります。
foreachの関連記事
foreachループについては次のテクニックも便利なのでついでに紹介
foreachループ内で最初と最後を判別する方法
ループしているときに最初と最後の要素を判別したいときってありますよね。
でもわざわざインデックス変数を用意するのは面倒・・・
そういう場合にコードをスマートにして最初と最後を判断できる方法です。
ここまでのまとめ
ということでここまでを簡単にまとめると次の通り
- foreach内で要素削除にはunset関数を使う
- ただし要素を直接は削除できないので注意!
ということでforeachループ内で要素を削除する方法でした。
ではでは・△・)ノ バイバイ