Slide 1

Slide 1 text

Iterators IN PHP NOW WITH GENERATORS

Slide 2

Slide 2 text

http://bitly.com/wNwg6N

Slide 3

Slide 3 text

An iterator is an object that enables a programmer to traverse a container. Various types of iterators are often provided via a container's interface. Source: http://en.wikipedia.org/wiki/Iterator

Slide 4

Slide 4 text

PHP also have a lot of awesome features; at least two of them are in my opinion largely underused: Iterators and Streams. “ ” Fabien Potencier (Lead Developer of Symfony Project) Source: http://fabien.potencier.org/article/44/php-iterators-and-streams-are-awesome

Slide 5

Slide 5 text

One Iterator Two Iterator Three Iterator floor();

Slide 6

Slide 6 text

Where are Iterators Used?

Slide 7

Slide 7 text

Iterators in Source https://github.com/php/php-src/tree/master/ext/spl

Slide 8

Slide 8 text

Everyone Loves Iterators

Slide 9

Slide 9 text

Everyone Loves Iterators Have you used SimpleXML?

Slide 10

Slide 10 text

Everyone Loves Iterators Have you used SimpleXML? Have you used pdo?

Slide 11

Slide 11 text

class IterableFilterIterator extends FilterIterator { public function accept() { return in_array("Iterator", class_implements($this->current())); } } $classes = new IterableFilterIterator(new ArrayIterator(get_declared_classes())); foreach ($classes as $name) { echo $name . "\n"; } Classes that implement Iterator

Slide 12

Slide 12 text

class IterableFilterIterator extends FilterIterator { public function accept() { return in_array("Iterator", class_implements($this->current())); } } $classes = new IterableFilterIterator(new ArrayIterator(get_declared_classes())); foreach ($classes as $name) { echo $name . "\n"; } Classes that implement Iterator Generator RecursiveIteratorIterator IteratorIterator FilterIterator RecursiveFilterIterator CallbackFilterIterator RecursiveCallbackFilterIterator ParentIterator LimitIterator CachingIterator RecursiveCachingIterator NoRewindIterator AppendIterator InfiniteIterator RegexIterator RecursiveRegexIterator EmptyIterator RecursiveTreeIterator ArrayIterator RecursiveArrayIterator DirectoryIterator FilesystemIterator RecursiveDirectoryIterator GlobIterator SplFileObject SplTempFileObject SplDoublyLinkedList SplQueue SplStack SplHeap SplMinHeap SplMaxHeap SplPriorityQueue SplFixedArray SplObjectStorage MultipleIterator IntlIterator IntlPartsIterator Phar PharData SimpleXMLIterator MongoCursor

Slide 13

Slide 13 text

Defining an Iterator

Slide 14

Slide 14 text

Iterator Interfaces

Slide 15

Slide 15 text

Iterator Interfaces • Traversable • Iterator • RecursiveIterator • Countable • SeekableIterator Source: http://www.php.net/manual/en/spl.iterators.php

Slide 16

Slide 16 text

Interface - Iterator Source: http://us.php.net/manual/en/class.iterator.php Iterator extends Traversable { /* Methods */ abstract public mixed current ( void ) abstract public scalar key ( void ) abstract public void next ( void ) abstract public void rewind ( void ) abstract public boolean valid ( void ) }

Slide 17

Slide 17 text

Interface - RecursiveIterator Source: http://www.php.net/manual/en/spl.iterators.php RecursiveIterator extends Iterator { /* Methods */ public RecursiveIterator getChildren ( void ) public bool hasChildren ( void ) /* Inherited methods */ abstract public mixed Iterator::current ( void ) abstract public scalar Iterator::key ( void ) abstract public void Iterator::next ( void ) abstract public void Iterator::rewind ( void ) abstract public boolean Iterator::valid ( void ) }

Slide 18

Slide 18 text

Interface - Countable Source: http://www.php.net/manual/en/spl.iterators.php Countable { /* Methods */ abstract public int count ( void ) }

Slide 19

Slide 19 text

Interface - Seekable Source: http://www.php.net/manual/en/spl.iterators.php SeekableIterator extends Iterator { /* Methods */ abstract public void seek ( int $position ) /* Inherited methods */ abstract public mixed Iterator::current ( void ) abstract public scalar Iterator::key ( void ) abstract public void Iterator::next ( void ) abstract public void Iterator::rewind ( void ) abstract public boolean Iterator::valid ( void ) }

Slide 20

Slide 20 text

Iterator Basics

Slide 21

Slide 21 text

Iterator Aggregate Iterator Aggregate is used when you need to offload iteration, and its methods, to another iterator public function getIterator() { ... }

Slide 22

Slide 22 text

Iterator Aggregate Iterator Aggregate Iterator

Slide 23

Slide 23 text

Outer Iterator Outer Iterators act as a wrapper layer. Outer iterator is iterated and then internally iterates over inner iterator. * * * ITERATOR!

Slide 24

Slide 24 text

Outer Iterator Outer Iterator Inner Iterator

Slide 25

Slide 25 text

Outer Iterator Outer Iterator Inner Iterator

Slide 26

Slide 26 text

Recursive Iterator Recursive Iterators prepare an iterator to be recursively iterated. * Requires RecursiveIteratorIterator to properly recursively Iterate. *

Slide 27

Slide 27 text

Recursive Iterator Recursive Iterator Get Children

Slide 28

Slide 28 text

Iterator Notes If you use foreach it will auto rewind. Using for or while will require you to rewind iterator.

Slide 29

Slide 29 text

Recursive Iterators

Slide 30

Slide 30 text

$data = [ 'title' => 'how to work with iterators', 'posts' => [ [ 'title' => 'introduction to iterators', 'email' => '[email protected]', ], [ 'title' => 'extending iterators', 'email' => '[email protected]', ], ], ]; foreach (new RecursiveArrayIterator($data) as $field => $val) { echo "{$field}:{$val}\n"; } Sub Title Recursive*Iterator Recursively Iterate Array

Slide 31

Slide 31 text

$data = [ 'title' => 'how to work with iterators', 'posts' => [ [ 'title' => 'introduction to iterators', 'email' => '[email protected]', ], [ 'title' => 'extending iterators', 'email' => '[email protected]', ], ], ]; foreach (new RecursiveArrayIterator($data) as $field => $val) { echo "{$field}:{$val}\n"; } Sub Title Recursive*Iterator Recursively Iterate Array title: how to work with iterators posts: Array

Slide 32

Slide 32 text

$data = [ 'title' => 'how to work with iterators', 'posts' => [ [ 'title' => 'introduction to iterators', 'email' => '[email protected]', ], [ 'title' => 'extending iterators', 'email' => '[email protected]', ], ], ]; foreach (new RecursiveArrayIterator($data) as $field => $val) { echo "{$field}:{$val}\n"; } Sub Title Recursive*Iterator Recursively Iterate Array title: how to work with iterators posts: Array

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

RecursiveIteratorIterator implements OuterIterator , Traversable , Iterator { /* Constants */ const integer LEAVES_ONLY = 0 ; const integer SELF_FIRST = 1 ; const integer CHILD_FIRST = 2 ; const integer CATCH_GET_CHILD = 16 ; }

Slide 35

Slide 35 text

$data = [ 'title' => 'how to work with iterators', 'posts' => [ [ 'title' => 'introduction to iterators', 'email' => '[email protected]', ], [ 'title' => 'extending iterators', 'email' => '[email protected]', ], ], ]; $it = new RecursiveIteratorIterator( new RecursiveArrayIterator($data) ); foreach($it as $field => $val) { echo "{$field}:{$val}\n"; } Sub Title Recursive*Iterator Recursively Iterate Array

Slide 36

Slide 36 text

$data = [ 'title' => 'how to work with iterators', 'posts' => [ [ 'title' => 'introduction to iterators', 'email' => '[email protected]', ], [ 'title' => 'extending iterators', 'email' => '[email protected]', ], ], ]; $it = new RecursiveIteratorIterator( new RecursiveArrayIterator($data) ); foreach($it as $field => $val) { echo "{$field}:{$val}\n"; } Sub Title Recursive*Iterator Recursively Iterate Array title: how to work with iterators title: introduction to iterators email: [email protected] title: extending iterators email: [email protected]

Slide 37

Slide 37 text

$it = new RecursiveArrayIterator([ 'Home', 'About' => ['Careers', 'Contact'], 'Location', 'FAQ', ]); Sub Title RecursiveNavigationIterator Hooks Output multi-dimensional array as UL/LI

Slide 38

Slide 38 text

class RecursiveNavigationIterator extends RecursiveIteratorIterator { public $openTag = "
    "; public $closeTag = "
"; public function beginIteration() { echo $this->openTag . PHP_EOL; } public function endIteration() { echo $this->closeTag . PHP_EOL; } public function beginChildren() { echo $this->openTag . PHP_EOL; } public function endChildren() { echo $this->closeTag . PHP_EOL; } } Sub Title RecursiveNavigationIterator Hooks Output multi-dimensional array as UL/LI

Slide 39

Slide 39 text

$it = new RecursiveArrayIterator([ 'Home', 'About' => ['Careers', 'Contact'], 'Location', 'FAQ', ]); $navIt = new RecursiveNavigationIterator($it, RecursiveIteratorIterator::SELF_FIRST); foreach ($navIt as $navItem) { echo "
  • {$navItem}
  • " . PHP_EOL; } Sub Title RecursiveNavigationIterator Hooks Output multi-dimensional array as UL/LI

    Slide 40

    Slide 40 text

    $it = new RecursiveArrayIterator([ 'Home', 'About' => ['Careers', 'Contact'], 'Location', 'FAQ', ]); $navIt = new RecursiveNavigationIterator($it, RecursiveIteratorIterator::SELF_FIRST); foreach ($navIt as $navItem) { echo "
  • {$navItem}
  • " . PHP_EOL; } Sub Title RecursiveNavigationIterator Hooks Output multi-dimensional array as UL/LI
    • Home
    • About
      • Careers
      • Contact
    • Location
    • FAQ

    Slide 41

    Slide 41 text

    Problem: Source: http://www.php.net/manual/en/spl.iterators.php I have a cache folder, but it goes many folders deep.

    Slide 42

    Slide 42 text

    $it = new RecursiveIteratorIterator( new RecursiveDirectoryIterator('cache', FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST ); function clearCache(Iterator $it) { // Check if directory if ($it->current()->isDir()) { rmdir($it->key()); return true; } return unlink($it->key()); } iterator_apply($it, 'clearCache', [$it]); Sub Title iterator_apply Clear all files/folders in cache folder

    Slide 43

    Slide 43 text

    Directory Iterator

    Slide 44

    Slide 44 text

    $it = new DirectoryIterator('vendor'); foreach ($it as $file) { echo $file->getFilename() . PHP_EOL; } Sub Title DirectoryIterator Source: Output directory content for Composer vendors http://us.php.net/manual/en/class.directoryiterator.php SplFileInfo

    Slide 45

    Slide 45 text

    $it = new DirectoryIterator('vendor'); foreach ($it as $file) { echo $file->getFilename() . PHP_EOL; } Sub Title DirectoryIterator Source: Output directory content for Composer vendors http://us.php.net/manual/en/class.directoryiterator.php SplFileInfo . .. aura autoload.php bin composer monolog psr robmorgan slim slimcontroller symfony vlucas

    Slide 46

    Slide 46 text

    Directory Iterator Note If you attempt to access a file that you do not have permission to. You will receive a UnexpectedValueException.

    Slide 47

    Slide 47 text

    Filesystem Iterator

    Slide 48

    Slide 48 text

    FilesystemIterator extends DirectoryIterator implements SeekableIterator , Traversable , Iterator { /* Constants */ const integer CURRENT_AS_PATHNAME = 32 ; const integer CURRENT_AS_FILEINFO = 0 ; const integer CURRENT_AS_SELF = 16 ; const integer CURRENT_MODE_MASK = 240 ; const integer KEY_AS_PATHNAME = 0 ; const integer KEY_AS_FILENAME = 256 ; const integer FOLLOW_SYMLINKS = 512 ; const integer KEY_MODE_MASK = 3840 ; const integer NEW_CURRENT_AND_KEY = 256 ; const integer SKIP_DOTS = 4096 ; const integer UNIX_PATHS = 8192 ; // Default Flags FilesystemIterator::KEY_AS_PATHNAME FilesystemIterator::CURRENT_AS_FILEINFO FilesystemIterator::SKIP_DOTS Sub Title FileSystemIterator (PHP 5.3.x) FileSystemIterator Constants/Flags

    Slide 49

    Slide 49 text

    Glob Iterator

    Slide 50

    Slide 50 text

    $it = new GlobIterator('vendor/*/*.php'); foreach ($it as $path => $file) { echo $path . " - " . $file->getFilename() . PHP_EOL; } Sub Title GlobIterator Source: Output directory content for Composer vendors http://us.php.net/manual/en/class.globiterator.php

    Slide 51

    Slide 51 text

    $it = new GlobIterator('vendor/*/*.php'); foreach ($it as $path => $file) { echo $path . " - " . $file->getFilename() . PHP_EOL; } Sub Title GlobIterator Source: Output directory content for Composer vendors http://us.php.net/manual/en/class.globiterator.php vendor/composer/ClassLoader.php - ClassLoader.php vendor/composer/autoload_classmap.php - autoload_classmap.php vendor/composer/autoload_namespaces.php - autoload_namespaces.php vendor/composer/autoload_psr4.php - autoload_psr4.php vendor/composer/autoload_real.php - autoload_real.php

    Slide 52

    Slide 52 text

    $it = new RecursiveDirectoryIterator('vendor'); foreach (new RecursiveTreeIterator($it) as $file) { echo $file . PHP_EOL; } Sub Title RecursiveTreeIterator Source: Output ASCII view of Directory Structure http://us.php.net/manual/en/class.recursivetreeiterator.php

    Slide 53

    Slide 53 text

    $it = new RecursiveDirectoryIterator('vendor'); foreach (new RecursiveTreeIterator($it) as $file) { echo $file . PHP_EOL; } Sub Title RecursiveTreeIterator Source: Output ASCII view of Directory Structure http://us.php.net/manual/en/class.recursivetreeiterator.php \-vendor/vlucas |-vendor/vlucas/. |-vendor/vlucas/.. \-vendor/vlucas/phpdotenv |-vendor/vlucas/phpdotenv/. |-vendor/vlucas/phpdotenv/.. |-vendor/vlucas/phpdotenv/.git | |-vendor/vlucas/phpdotenv/.git/. | |-vendor/vlucas/phpdotenv/.git/.. | |-vendor/vlucas/phpdotenv/.git/FETCH_HEAD | |-vendor/vlucas/phpdotenv/.git/HEAD | |-vendor/vlucas/phpdotenv/.git/ORIG_HEAD | |-vendor/vlucas/phpdotenv/.git/branches | | |-vendor/vlucas/phpdotenv/.git/branches/. | | \-vendor/vlucas/phpdotenv/.git/branches/.. | |-vendor/vlucas/phpdotenv/.git/config | |-vendor/vlucas/phpdotenv/.git/description

    Slide 54

    Slide 54 text

    Filter Iterator

    Slide 55

    Slide 55 text

    Source: http://www.php.net/manual/en/spl.iterators.php Need to view all files in a directory, but it keeps returning Version Control folders (.svn and .git). Problem:

    Slide 56

    Slide 56 text

    class NoVCSIterator extends FilterIterator { public function accept() { $vcsFolders = array(".git", ".svn"); $file = $this->current(); if ($file->isDir() && (in_array($vcsFolders, $file->getFilename())) { return false; } return true; } } Sub Title FilterIterator Do not show Version Control folders

    Slide 57

    Slide 57 text

    Source: http://www.php.net/manual/en/spl.iterators.php I need to see all images that are over 5MB that have been uploaded. Problem:

    Slide 58

    Slide 58 text

    class LargeFileFilterIterator extends FilterIterator { public function accept() { $file = $this->current(); if ($file->getSize() > $this->fileSizeMin) { return true; } return false; } } class ImageFilterIterator extends FilterIterator { public function accept() { $file = $this->current(); if (in_array($file->getExtension(), $this->imageWhiteList)) { return true; } return false; } } Sub Title FilterIterator Only show images greater than 5MB

    Slide 59

    Slide 59 text

    $dir = new FileSystemIterator(UPLOADS_PATH); $filterIt = new LargeFileFilterIterator( new ImageFilterIterator($dir, ['jpg']) ); foreach($filterIt as $file) { echo $file->getFileName() . PHP_EOL; } Sub Title FilterIterator Only show images greater than 5MB

    Slide 60

    Slide 60 text

    $dir = new FileSystemIterator(UPLOADS_PATH); $filterIt = new LargeFileFilterIterator( new ImageFilterIterator($dir, ['jpg']) ); echo count($filterIt); // 1 echo iterator_count($filterIt); // 2 foreach($filterIt as $file) { echo $file->getFileName() . PHP_EOL; } Sub Title iterator_count Countable with Filters

    Slide 61

    Slide 61 text

    Regex Iterator

    Slide 62

    Slide 62 text

    /* Constants */ const integer RegexIterator->MATCH = 0 ; const integer GET_MATCH = 1 ; const integer ALL_MATCHES = 2 ; const integer SPLIT = 3 ; const integer REPLACE = 4 ; const integer USE_KEY = 1 ; $it = new RecursiveDirectoryIterator( 'vendor', RecursiveDirectoryIterator::SKIP_DOTS ); $regexIt = new RecursiveRegexIterator( $it, '/^.*\.(php|env|json|yml)$/', RegexIterator::ALL_MATCHES ); foreach (new RecursiveIteratorIterator($regexIt) as $path => $file) { echo $path . PHP_EOL; } Sub Title RegexIterator Source: Match specific file types with RecursiveDirectoryIterator http://us3.php.net/manual/en/class.regexiterator.php

    Slide 63

    Slide 63 text

    /* Constants */ const integer RegexIterator->MATCH = 0 ; const integer GET_MATCH = 1 ; const integer ALL_MATCHES = 2 ; const integer SPLIT = 3 ; const integer REPLACE = 4 ; const integer USE_KEY = 1 ; $it = new RecursiveDirectoryIterator( 'vendor', RecursiveDirectoryIterator::SKIP_DOTS ); $regexIt = new RecursiveRegexIterator( $it, '/^.*\.(php|env|json|yml)$/', RegexIterator::ALL_MATCHES ); foreach (new RecursiveIteratorIterator($regexIt) as $path => $file) { echo $path . PHP_EOL; } Sub Title RegexIterator Source: Match specific file types with RecursiveDirectoryIterator http://us3.php.net/manual/en/class.regexiterator.php vendor/autoload.php vendor/composer/ClassLoader.php vendor/composer/autoload_classmap.php vendor/composer/autoload_namespaces.php vendor/composer/autoload_psr4.php vendor/composer/autoload_real.php vendor/composer/installed.json

    Slide 64

    Slide 64 text

    Parent Iterator

    Slide 65

    Slide 65 text

    Source: http://www.php.net/manual/en/spl.iterators.php Parent Iterator is a FilterIterator that only accepts elements that have children. Hence the name ParentIterator Parent Iterator

    Slide 66

    Slide 66 text

    Limit Iterator

    Slide 67

    Slide 67 text

    Source: http://www.php.net/manual/en/spl.iterators.php Currently have a CSV with a lot of lines, but I need to paginate with 3 results per page. Problem:

    Slide 68

    Slide 68 text

    $usersCSV = <<fwrite($usersCSV); $csv->setFlags(SplFileObject::READ_CSV); $it = new LimitIterator($csv, 0, 3); foreach ($it as list($username, $firstName, $lastName, $email)) { echo "{$firstName} {$lastName}" . PHP_EOL; } Sub Title LimitIterator Limit CSV output to first 3

    Slide 69

    Slide 69 text

    $usersCSV = <<fwrite($usersCSV); $csv->setFlags(SplFileObject::READ_CSV); $it = new LimitIterator($csv, 0, 3); foreach ($it as list($username, $firstName, $lastName, $email)) { echo "{$firstName} {$lastName}" . PHP_EOL; } Sub Title LimitIterator Limit CSV output to first 3 Jake Smith Steve Austin Steven Rogers

    Slide 70

    Slide 70 text

    $usersCSV = <<fwrite($usersCSV); $csv->setFlags(SplFileObject::READ_CSV); $it = new LimitIterator($csv, 0, 3); try { $it->seek(20); } catch (OutOfBoundsException $e) { echo "Error: " . $e->getMessage() . PHP_EOL; } Sub Title LimitIterator Throw Exception if seeking beyond total number of elements

    Slide 71

    Slide 71 text

    $usersCSV = <<fwrite($usersCSV); $csv->setFlags(SplFileObject::READ_CSV); $it = new LimitIterator($csv, 0, 3); try { $it->seek(20); } catch (OutOfBoundsException $e) { echo "Error: " . $e->getMessage() . PHP_EOL; } Sub Title LimitIterator Throw Exception if seeking beyond total number of elements Error: Cannot seek to 20 which is behind offset 0 plus count 3

    Slide 72

    Slide 72 text

    Callback Filter Iterator

    Slide 73

    Slide 73 text

    Source: http://www.php.net/manual/en/spl.iterators.php I need to find all files that contain the word “recursive”, but don’t want to create a new class to extend FilterIterator. Problem:

    Slide 74

    Slide 74 text

    $dirIt = new GlobIterator('*.php'); $recursiveFiles = new CallbackFilterIterator( $dirIt, function($current, $key, $it) { return preg_match('/recursive/i', $current); } ); foreach($recursiveFiles as $name) { echo $name . PHP_EOL; } Sub Title CallbackFilterIterator CallbackFilterIterator requires PHP 5.4

    Slide 75

    Slide 75 text

    $dirIt = new GlobIterator('*.php'); $recursiveFiles = new CallbackFilterIterator( $dirIt, function($current, $key, $it) { return preg_match('/recursive/i', $current); } ); foreach($recursiveFiles as $name) { echo $name . PHP_EOL; } Sub Title CallbackFilterIterator CallbackFilterIterator requires PHP 5.4 /recursive_cache.php /recursive_it.php

    Slide 76

    Slide 76 text

    Caching Iterator

    Slide 77

    Slide 77 text

    Source: http://www.php.net/manual/en/spl.iterators.php I need to know what value of the next element will be. Think prev/ next navigation. Problem:

    Slide 78

    Slide 78 text

    $articles = new ArrayIterator([ 'NetTuts.com: Integrating Zendesk With WordPress', 'Laravel News: The Artisan Files Alex Dover', 'That Podcast: Episode 10 The one with the "best practices"', 'Community News: Packagist Latest Releases for 11.14.2014', ]); $it = new CachingIterator($articles); $it->rewind(); foreach ($it as $article) { echo "{$article}"; if ($it->hasNext()) { echo " --- {$it->getInnerIterator()->current()}"; } echo PHP_EOL; } Sub Title CachingIterator CachingIterator? Look Ahead Iterator! Source: http://stackoverflow.com/questions/2458099/peek-ahead-when-iterating-an-array-in-php-5-2

    Slide 79

    Slide 79 text

    $articles = new ArrayIterator([ 'NetTuts.com: Integrating Zendesk With WordPress', 'Laravel News: The Artisan Files Alex Dover', 'That Podcast: Episode 10 The one with the "best practices"', 'Community News: Packagist Latest Releases for 11.14.2014', ]); $it = new CachingIterator($articles); $it->rewind(); foreach ($it as $article) { echo "{$article}"; if ($it->hasNext()) { echo " --- {$it->getInnerIterator()->current()}"; } echo PHP_EOL; } Sub Title CachingIterator CachingIterator? Look Ahead Iterator! Source: http://stackoverflow.com/questions/2458099/peek-ahead-when-iterating-an-array-in-php-5-2 NetTuts.com: Integrating Zendesk With WordPress --- Laravel News: The Artisan Files Alex Dover Laravel News: The Artisan Files Alex Dover --- That Podcast: Episode 10 The one with the "best practices" That Podcast: Episode 10 The one with the "best practices" --- Community News: Packagist Latest Releases for 11.14.2014 Community News: Packagist Latest Releases for 11.14.2014

    Slide 80

    Slide 80 text

    Generators

    Slide 81

    Slide 81 text

    function getLines($file) { $f = fopen($file, 'r'); if (!$f) throw new Exception(); while ($line = fgets($f)) { yield $line; } fclose($f); } Sub Title Generator We Have a Generator http://blog.ircmaxell.com/2012/07/what-generators-can-do-for-you.html It’s really that easy!

    Slide 82

    Slide 82 text

    NOW IN PHP

    Slide 83

    Slide 83 text

    function easyAsAbc() { yield 1; yield 2; yield 3; } foreach (easyAsAbc() as $num) { echo $num . PHP_EOL; } Sub Title Quick Tips with Yield http://us3.php.net/manual/en/language.generators.syntax.php

    Slide 84

    Slide 84 text

    function easyAsAbc() { yield 1; yield 2; yield 3; } foreach (easyAsAbc() as $num) { echo $num . PHP_EOL; } Sub Title Quick Tips with Yield http://us3.php.net/manual/en/language.generators.syntax.php 1 2 3

    Slide 85

    Slide 85 text

    function easyAsAbc() { yield 1; return; yield 2; yield 3; } foreach (easyAsAbc() as $num) { echo $num . PHP_EOL; } Sub Title Quick Tips with Yield http://us3.php.net/manual/en/language.generators.syntax.php End an iteration

    Slide 86

    Slide 86 text

    function easyAsAbc() { yield 1; return; yield 2; yield 3; } foreach (easyAsAbc() as $num) { echo $num . PHP_EOL; } Sub Title Quick Tips with Yield http://us3.php.net/manual/en/language.generators.syntax.php End an iteration 1

    Slide 87

    Slide 87 text

    function easyAsAbc() { yield 1; return true; yield 2; yield 3; } foreach (easyAsAbc() as $num) { echo $num . PHP_EOL; } Sub Title Quick Tips with Yield http://us3.php.net/manual/en/language.generators.syntax.php Returning a value will cause a PHP Fatal Returning ANY VALUE will cause a PHP Fatal

    Slide 88

    Slide 88 text

    function easyAsAbc() { yield 1; return true; yield 2; yield 3; } foreach (easyAsAbc() as $num) { echo $num . PHP_EOL; } Sub Title Quick Tips with Yield http://us3.php.net/manual/en/language.generators.syntax.php Returning a value will cause a PHP Fatal Returning ANY VALUE will cause a PHP Fatal PHP Fatal error: Generators cannot return values using "return"

    Slide 89

    Slide 89 text

    function userAttributes() { yield 'id' => 1; yield 'username' => 'jsmith'; yield 'email' => '[email protected]'; } foreach (userAttributes() as $key => $val) { echo $key . ':' . $val . PHP_EOL; } Sub Title Quick Tips with Yield http://us3.php.net/manual/en/language.generators.syntax.php Key and Value yield

    Slide 90

    Slide 90 text

    function userAttributes() { yield 'id' => 1; yield 'username' => 'jsmith'; yield 'email' => '[email protected]'; } foreach (userAttributes() as $key => $val) { echo $key . ':' . $val . PHP_EOL; } Sub Title Quick Tips with Yield http://us3.php.net/manual/en/language.generators.syntax.php Key and Value yield id:1 username:jsmith email:[email protected]

    Slide 91

    Slide 91 text

    function counter($start) { for ($i = $start; $i >= $start; $i++) { $command = (yield $i); if ($command == "stop") { return; } } } $counter = counter(1); foreach ($counter as $num) { if ($num >= 20) { $counter->send('stop'); } echo $num . PHP_EOL; } Receive data Quick Tips with Yield

    Slide 92

    Slide 92 text

    function counter($start) { for ($i = $start; $i >= $start; $i++) { $command = (yield $i); if ($command == "stop") { return; } } } $counter = counter(1); foreach ($counter as $num) { if ($num >= 20) { $counter->send('stop'); } echo $num . PHP_EOL; } Receive data Quick Tips with Yield

    Slide 93

    Slide 93 text

    function counter($start) { for ($i = $start; $i >= $start; $i++) { $command = (yield $i); if ($command == "stop") { return; } } } $counter = counter(1); foreach ($counter as $num) { if ($num >= 20) { $counter->send('stop'); } echo $num . PHP_EOL; } Receive data Quick Tips with Yield Receiving values via send method

    Slide 94

    Slide 94 text

    function counter($start) { for ($i = $start; $i >= $start; $i++) { $command = (yield $i); if ($command == "stop") { return; } } } $counter = counter(1); foreach ($counter as $num) { if ($num >= 20) { $counter->send('stop'); } echo $num . PHP_EOL; } Receive data Quick Tips with Yield Receiving values via send method 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

    Slide 95

    Slide 95 text

    Other Iterators

    Slide 96

    Slide 96 text

    Other Iterators •EmptyIterator •If you try to access current() it will throw an Exception •InfiniteIterator •Continuously runs (auto rewinds)

    Slide 97

    Slide 97 text

    Iterator Functions

    Slide 98

    Slide 98 text

    Iterator Functions • iterator_to_array • If Iterator is Recursive, it will flatten array • iterator_apply • similar to array_walk • iterator_count • used when iterator doesn’t implement countable

    Slide 99

    Slide 99 text

    Questions? Concerns? Complaints?

    Slide 100

    Slide 100 text

    https://joind.in/12807

    Slide 101

    Slide 101 text

    jakefolio http://jakefolio.com [email protected] Jake Smith Thanks for Listening!