Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PHPの教室「foreachを極める」

27,420 views

Published on

録画の動画はこちら
http://new.livestream.com/shimokitazawa-osscafe/shimokita-php/videos/9891154

PHPの教室「foreachを極める」

  1. 1. PHPの教室 foreachを極める 超頻出する文法を徹底的に掘り尽くす! yando @ Shimokita.php
  2. 2. 提供 yando @ Shimokita.php
  3. 3. @yando• Yusuke Ando• PHPer• Engine Yard inc.• github.com/yandod/candycane yando @ Shimokita.php
  4. 4. おしながき• foreachの基礎• やりがちな失敗• 応用的な書き方 yando @ Shimokita.php
  5. 5. 基礎 yando @ Shimokita.php
  6. 6. 基本1 元になるデータ $listの数だけ実行 $key にインデックス $valに内容 yando @ Shimokita.php
  7. 7. foreach• 超優良ループ構文• 平均的なPHPerは一日に5回は書く• エラーの原因にもなる• いろいろな書き方がある yando @ Shimokita.php
  8. 8. We♥foreach• 無限ループしない• たいていのデータが配列• 配列をそのまま流せるので便利• Webアプリは一覧表示が多い yando @ Shimokita.php
  9. 9. forとかダルい 無限ループのリスク []などが多い yando @ Shimokita.php
  10. 10. while ...無理するなと言いたい yando @ Shimokita.php
  11. 11. ひとまず• PHPでループを書くならforeach• 使い方でphper度がわかる• よく使うからこそ重要• 細かい挙動も知っておくべき yando @ Shimokita.php
  12. 12. 基本2 元になる連想配列 $listの数だけ実行 $key にキー $valに内容 yando @ Shimokita.php
  13. 13. 基本3 元になる連想配列 $listの数だけ実行 $valに内容 キーは無視される yando @ Shimokita.php
  14. 14. 基本4 ここからforeach HTMLが書きやすい foreach終了 yando @ Shimokita.php
  15. 15. やりがちな失敗 yando @ Shimokita.php
  16. 16. 失敗• 配列チェック漏れ• 要素の更新• ループ終了後の変数• 多重foreach yando @ Shimokita.php
  17. 17. 配列?• foreachは配列しか回せない• データ取得結果がfalse null String• 処理できない• 空の配列であれば問題ない yando @ Shimokita.php
  18. 18. 失敗1 関数の結果を回す arrayではない (エラー時にありがち) 実行時エラー yando @ Shimokita.php
  19. 19. 失敗1 配列かチェック 配列の時だけ実行ネストが深くなってしまう yando @ Shimokita.php
  20. 20. 失敗1 配列で無ければ、 空の配列にする 配列と決め打ち 手抜きのnull呼び出し側に責務が増えてしまっている yando @ Shimokita.php
  21. 21. 教訓• 関数が返すデータの型の一貫性• エラー時の挙動を見落としがち• 検索結果が0件だとエラーで画面がめ ちゃくちゃになってしまったりすると 残念感アップ yando @ Shimokita.php
  22. 22. 更新• ループ内から変数を更新• 意図しない処理にならないか• データの大破壊 yando @ Shimokita.php
  23. 23. 失敗2 各要素を上書き 全て更新された yando @ Shimokita.php
  24. 24. 失敗2 各要素を上書き 更新されていない yando @ Shimokita.php
  25. 25. 失敗2 改 参照代入 更新された! yando @ Shimokita.php
  26. 26. 失敗2 オブジェクトの配列 各要素を上書き更新された yando @ Shimokita.php
  27. 27. 教訓• 配列の値は通常はコピーされる• & を付けた代入参照は黒魔術• オブジェクトはコピーされない• 一時変数への代入は避ける方が無難 yando @ Shimokita.php
  28. 28. 明解な方を使う オリジナルを更新 更新しないかも (配列 or 参照代入 or オブジェクト) yando @ Shimokita.php
  29. 29. ループの後• foreachで最後に使った変数が残る• ループが実行されない場合は未定義• あてにしてはいけない yando @ Shimokita.php
  30. 30. 失敗3 ループ外で使えてしまう yando @ Shimokita.php
  31. 31. 失敗3 変数が未定義 yando @ Shimokita.php
  32. 32. 多重• foreachは便利• データが複雑だとループ内でループ• 2重が限度• 3重以上は人間には読解が難しい yando @ Shimokita.php
  33. 33. 読みづらい yando @ Shimokita.php
  34. 34. 応用 yando @ Shimokita.php
  35. 35. 応用• 件数判定• 継続・中止• イテレーター• ジェネレーター yando @ Shimokita.php
  36. 36. 応用1 自分でカウンタを作る 自分でインクリメント yando @ Shimokita.php
  37. 37. 継続・中止• continueで次のループへ• breakでループをストップ• 処理しないでよいデータをスキップ yando @ Shimokita.php
  38. 38. 応用2 4バイト以下の時 次のループへ yando @ Shimokita.php
  39. 39. 応用2 4バイト以下の時 ループ全体を中止 yando @ Shimokita.php
  40. 40. イテレーター• Iteratorインターフェースを実装• rewind current key next valid• 上記のメソッドを実装• オブジェクトのデータや処理を回せる yando @ Shimokita.php
  41. 41. 回った yando @ Shimokita.php
  42. 42. イテレーター• is_array で判定できない• 複雑な処理ができるが• それってSPLで出来るかも? yando @ Shimokita.php
  43. 43. イテレーター 任意の件数を取り出す 正規表現マッチ yando @ Shimokita.php
  44. 44. ジェネレーター• PHP5.5からの新機能• イテレーターをもっと簡単に• 「前に進むだけのイテレーター」• returnの替わりにyieldでデータを返す yando @ Shimokita.php
  45. 45. 動くぞ 1回分のデータ yieldを含む関数を指定 普通に回せた! yando @ Shimokita.php
  46. 46. 活用法• 巨大な配列を作らずに処理• 通常のforeachは事前に配列が必要• 巨大なデータやファイル処理を高速化 yando @ Shimokita.php
  47. 47. 配列版 行数分の配列 使用量計測 普通に回せた! yando @ Shimokita.php
  48. 48. ジェネレータ版 ファイルポインタ 一行づつyield yando @ Shimokita.php
  49. 49. 結果 ジェネレータは大データ でもメモリを節約 yando @ Shimokita.php
  50. 50. まとめ yando @ Shimokita.php
  51. 51. 基本が大事• 頻繁に使うからこそ綺麗に• 摩訶不思議なループを書かない• 回しにくい関数を作らない yando @ Shimokita.php
  52. 52. おまけ• 実はオブジェクトは何でも回せる• PHP5.5なら代入にlistが使える yando @ Shimokita.php

×