Skip to content

Instantly share code, notes, and snippets.

@upsilon
Last active December 31, 2015 05:29
Show Gist options
  • Save upsilon/7941298 to your computer and use it in GitHub Desktop.
Save upsilon/7941298 to your computer and use it in GitHub Desktop.
array_walk のイテレーター版がほしい件
<?php
// こんなの
class HogeIterator implements IteratorAggregate
{
private
$innerIterator,
$callback;
public function __construct(Traversable $innerIterator, $callback)
{
$this->innerIterator = $innerIterator;
$this->callback = $callback;
}
public function getIterator()
{
foreach ($this->innerIterator as $key => $value)
{
$ret = call_user_func_array($this->callback, array(&$key, &$value));
if ($ret)
yield $key => $value;
}
}
}
$origIterator = new ArrayIterator(range(1, 30));
$iterator = new HogeIterator($origIterator, function(&$key, &$value) {
if (0 === $value % 3 && 0 === $value % 5)
$value = 'FizzBuzz';
elseif (0 === $value % 3)
$value = 'Fizz';
elseif (0 === $value % 5)
$value = "Buzz";
return true;
});
foreach ($iterator as $value)
echo $value."\n";
@upsilon
Copy link
Author

upsilon commented Dec 13, 2013

実行結果

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment