LoginSignup
18
17

More than 5 years have passed since last update.

最近知ったforeachのこと

Last updated at Posted at 2017-03-25

nullチェック不要

配列($arr)がnullだとエラーになるので、is_array()でチェックしてたけど、

before
if(is_array($arr)) {
  foreach($arr as $value) {
    (--- code ---) 
  }
}

キャストすれば、空配列になるので、チェック不要。

after
foreach((array)$arr as $value) {
  (--- code ---) 
}

コードが短くなった。

ジェネレーター・・・?

foreachは配列のためだけにあると思ってた。
複数の要素を1つの変数で扱うためには、とにかく配列にぶっこむものだと思ってた。
しかし、「ジェネレーター」なるものがあるらしい。

配列を定義して、必用な分だけ値をセットする代わりに、
関数を定義して、その中で必要な分だけyield [値];と追加していく。
yield ([キー]=>[値]);とすれば、連想配列のようなkey-value形式にも対応可能。

このyieldを含んだジェネレーター関数を実行すると、ジェネレーターオブジェクトが返され、
配列と同様にforeach文で扱うことができる。

array
$arr = [1, 3, 5];

foreach($arr as $value) {

と定義する代わりに

generator
function myGenerator() {
  yield 1;
  yield 3;
  yield 5;
}

foreach(myGenerator() as $value) {

と定義できる。

値に規則性がある場合は、for文などと組み合わせて、値を生成できる。
何度もyieldと書かなくて済む。
引数を受け取り、実行時に値を指定できるような関数にしておけば、使い回しができそう。

generator
function myGenerator($start, $end, $step) {
  for($i=$start; $i<$end; $i+=$step) {
    yield $i;
  }
}
foreach(myGenerator(1, 10, 2) as $value) {
18
17
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
17