PHPのforeachループで配列の要素を評価、除去する

今回はPHPの小ネタです。

PHPのforeachは、配列内の要素一つ一つに対して同じ処理を適用する際に便利です。構文は、以下の二種類です。

//構文1
foreach(配列 as 値を入れる変数){
処理
}
 
//構文2
foreach(配列 as キー値 => 値を入れる変数){
処理
}

構文1では配列内要素の値をそのまま順番に取得して変数に入れます。たとえば、”りんご”,”ごいさぎ”,”ぎんやんま”という3要素をもつ配列$Septemberがあったとき、

foreach($September as $value){
$value .= "?";
echo $value;
}

結果、りんご?ごいさぎ?ぎんやんま?が出力されます。これはあくまで値を変数に格納しているだけですので、元の配列$Septemberを処理終了後ダンプしてみても、内部の要素は”りんご”,”ごいさぎ”,”ぎんやんま”のままです。
元の配列の要素を変更する場合は、構文2を使います。

foreach($September as $key => $value){
$September[$key] .= "?";
}

これで$Septemberをダンプすると”りんご?”,”ごいさぎ?”,”ぎんやんま?”となっています。
この挙動は、元からキー値つきで宣言された配列に関しても同じです。

$September = array("果物" => "りんご","鳥" => "ごいさぎ","虫" => "ぎんやんま");
foreach($September as $key => $value){
$September[$key] .= "?";
}
 
//$Septemberは("果物" => "りんご?","鳥" => "ごいさぎ?","虫" => "ぎんやんま?")

配列の要素の改変についてはこれでOKですが、配列の要素を評価して削除する場合にはどのようにすればいいのか。要素を削除することでループのインデックスが変わってしまって不都合になるのではないかと心配しましたが、思いつくままunsetを使って、特に問題ない結果を得られました。

foreach($September as $key => $value){
if($September[$key] == "ごいさぎ"){
unset($September[$key]);
}
}
 
//$Septemberは、("りんご","ぎんやんま")

ただし、この場合配列のインデックスが歯抜けになってしまいますので、連番のインデックスに戻したい場合には、array_values関数を使わないといけません。
カンマ区切りで保存してあるデータを取り出し、explodeしたあとforeach内で評価、特定の値のものを削除してimplodeで元に戻す。といった処理の流れで使えそうです。


コメントを残す

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