PHPに限らずforeachって便利な構文ですよね。
何が便利かと言ったらインデックス用の変数を用意しなくて連想配列だけでループを回せることです。
ただ最初だけとか最後だけで特別な処理をしたいこともありますよね。
という訳でそのやり方について書いていきます。
最初と最後を判別する方法
ではforeachループ内で最初と最後の派別する方法を紹介していきます。
そのやり方とはそれぞれ次の通り
最初かどうかを判別
まず最初(インデックスでいえば0番目)かを判別するにはreset関数を使います。
reset関数は公式では次のように説明されています。
mixed reset ( array
&$array
)array の内部ポインタの先頭の要素に戻し、配列の最初の要素の値を返します。
引用元 : PHP.net - resetの項目より
C言語みたいにポインタを最初に戻すという処理がメインのようです。
ですが最初の要素の値も返してくれるのでループ内で最初かどうかの判別にも利用できます。
そのコード例は次の通り
1 2 3 4 5 |
$days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; foreach( $days as $day ){ if( $day === reset($days) ){ print_r( 'Start days : ' ); } print_r( $day . ' ' ); } |
reset関数に配列を渡し、現在の値と一致するかどうか比較しているだけです。
厳密に比較するならこのコードのように === を使った方がいいです。
このコード例の表示結果は次の通り
1 |
Start days : Sun Mon Tue Wed Thu Fri Sat |
インデックス変数を使っても同じことは当然できます。
ただほとんど使わない変数をわざわざ用意するよりはかなりスマートですね。
最後かどうか判別
次は最後かどうかを判別する方法ですが、こちらはend関数というものを使います。
これも公式リファレンスから引用すると次のように説明してありました。
mixed end ( array
&$array
)arrayの内部ポインタを最後の要素まで進め、その値を返します。
引用元 : PHP.net - endの項目より
先ほどのreset関数の逆バージョンです。
これを利用したコード例は次の通り
1 2 3 4 5 |
$days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; foreach( $days as $day ){ print_r( $day . ' ' ); if( $day === end($days) ){ print_r( ': End weekdays' ); } } |
end関数による判別の仕方はreset関数の時と全く同じです。
そしてこのコードの表示結果は次の通り
1 |
Sun Mon Tue Wed Thu Fri Sat : End weekdays |
インデックス変数を用意しなくていいので見やすいしコードも簡潔になります。
foreachについての関連記事
foreachループ内では次のようなテクニックも使えると便利なので関連記事として紹介
foreach内で連想配列の要素を削除
ループの途中で連想配列の要素を削除するにはunset関数が使えます。
詳しいやり方については次の記事を参照
ここまでのまとめ
という訳でここまでのことを簡単にまとめると次の通り
- foreachループ内で最初を判別
⇒ reset関数で返される値と現在の配列変数を比較
- foreachループ内で最期を判別
⇒ end関数で返される値と現在の配列変数を比較
これだけです。
僕自身今まで最初と最後の判定にはインデックス変数を使っていました。
ですが簡潔&簡単な方法が発見できたので、こちらを使っていこうと思います。
ではでは($・・)/~~~