Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP Generatorまとめ

PHP Generatorまとめ

Avatar for rightgo09

rightgo09

May 14, 2015

Other Decks in Programming

Transcript

  1. <?php $reward_list = [ [13, 67, 23], // 1戦目の報酬 [2,

    87, 30], // 2戦目の報酬 [85, 25, 41], // 3戦目の報酬 ]; // 普通の二次元ループ foreach ($reward_list as $rewards) { foreach ($rewards as $reward) { echo "\$reward -> $reward\n"; } } ΍ͬͯΈΔͦͷ̍ &YBNQMF
  2. <?php $reward_list = [ [13, 67, 23], // 1戦目の報酬 [2,

    87, 30], // 2戦目の報酬 [85, 25, 41], // 3戦目の報酬 ]; // ジェネレータ(を返す関数) function reward_generator($reward_list) { foreach ($reward_list as $rewards) { foreach ($rewards as $reward) { yield $reward; } } } foreach (reward_generator($reward_list) as $reward) { echo "\$reward -> $reward\n"; } ΍ͬͯΈΔͦͷ̍ &YBNQMF
  3. ΍ͬͯΈΔͦͷ̍ &YBNQMF <?php // ジェネレータ(を返す関数) function reward_generator($reward_list) { foreach ($reward_list

    as $rewards) { foreach ($rewards as $reward) { yield $reward; } } } // 別パターン $g = reward_generator($reward_list); while ($g->valid()) { $reward = $g->current(); echo "\$reward -> $reward\n"; $g->next(); } ΠςϨʔλ
  4. <?php // 一気飲みパターン foreach (range(0, 1000000) as $val) { $sum

    += $val; } // ジェネレータ関数 function xrange($start, $end) { for ($i = $start; $i <= $end; $i++) { yield $i; } } foreach (xrange(0, 1000000) as $val) { $sum += $val; } ΍ͬͯΈΔͦͷ̎ &YBNQMF time: 0.2835 memory (byte): 144965632 time: 0.8537 memory (byte): 262144
  5. ΍ͬͯΈΔͦͷ̏ &YBNQMF <?php function sum_generator($count) { $sum = 0; foreach

    (range(1, $count) as $i) { $sum += (yield $i); // 要括弧 } echo $sum; } $g = sum_generator(10); while ($g->valid()) { $num = $g->current(); $g->send($num * 2); // sendでyield自体の返り値とできる // $g->next(); // sendは自動的に進むのでnextしなくてよい }
  6. ΍ͬͯΈΔͦͷ̏ &YBNQMF # Rubyなら def sum_generator(count) sum = 0 1.upto(count)

    do |i| sum += yield i end sum # 返り値 end sum = sum_generator(10){|i| i * 2}
  7. ΍ͬͯΈΔͦͷ̏ &YBNQMF <?php function sum_generator($count) { $sum = 0; foreach

    (range(1, $count) as $i) { $sum += (yield $i); // 要括弧 } return $sum; } ... $sum = $g->getReturn(); // こうできたらいい • こうだったらいい • PHP7 RFC • https://wiki.php.net/rfc/generator-return-expressions