<?php
class Foo {
public $name;
public $type;
public function __construct($name, $type) {
$this->name = $name;
$this->type = $type;
}
public static function searchZeroType($o) {
return ($o->type == 0);
}
public static function doubleType($o) {
$r = $o->type;
$r= $r * 2;
return $r;
}
}
class SplObjectStorageExtended extends SplObjectStorage {
public function objectFilter(callable $c) {
$s = new SplObjectStorageExtended();
foreach($this as $object) {
if ($c($object)) {
$s->attach($object);
}
}
return $s;
}
public function objectMap(callable $c) {
foreach($this as $object) {
$array[] = $c($object);
}
return $array;
}
public function objectWalk(callable $c) {
foreach ($this as $object) {
$c($object);
}
}
}
$a = new SplObjectStorageExtended();
$a->attach(new Foo('first', 1));
$a->attach(new Foo('second', 1));
$a->attach(new Foo('third', 0));
$a->attach(new Foo('fourth', 1));
$search = $a->objectFilter(array('Foo', 'searchZeroType')); $double = $a->objectMap(array('Foo', 'doubleType'), $a);
$a->objectWalk(function($o) {echo $o->name . " ";});
//print_r($search);
PD9waHAKY2xhc3MgRm9vIHsKCXB1YmxpYyAkbmFtZTsKCXB1YmxpYyAkdHlwZTsKCQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRuYW1lLCAkdHlwZSkgewoJCSR0aGlzLT5uYW1lID0gJG5hbWU7CgkJJHRoaXMtPnR5cGUgPSAkdHlwZTsKCX0KCQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZWFyY2haZXJvVHlwZSgkbykgewoJCXJldHVybiAoJG8tPnR5cGUgPT0gMCk7Cgl9CgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZG91YmxlVHlwZSgkbykgewoJCSRyID0gJG8tPnR5cGU7CgkJJHI9ICRyICogMjsKCQkKCQlyZXR1cm4gJHI7Cgl9Cn0KCmNsYXNzIFNwbE9iamVjdFN0b3JhZ2VFeHRlbmRlZCBleHRlbmRzIFNwbE9iamVjdFN0b3JhZ2UgewoJCglwdWJsaWMgZnVuY3Rpb24gb2JqZWN0RmlsdGVyKGNhbGxhYmxlICRjKSB7CgkJJHMgPSBuZXcgU3BsT2JqZWN0U3RvcmFnZUV4dGVuZGVkKCk7CgkJCgkJZm9yZWFjaCgkdGhpcyBhcyAkb2JqZWN0KSB7CgkJCWlmICgkYygkb2JqZWN0KSkgewoJCQkJJHMtPmF0dGFjaCgkb2JqZWN0KTsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gJHM7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBvYmplY3RNYXAoY2FsbGFibGUgJGMpIHsKCQkkYXJyYXkgPSBhcnJheSgpOwoJCQoJCWZvcmVhY2goJHRoaXMgYXMgJG9iamVjdCkgewoJCQkkYXJyYXlbXSA9ICRjKCRvYmplY3QpOwoJCX0KCQkKCQlyZXR1cm4gJGFycmF5OwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gb2JqZWN0V2FsayhjYWxsYWJsZSAkYykgewoJCWZvcmVhY2ggKCR0aGlzIGFzICRvYmplY3QpIHsKCQkJJGMoJG9iamVjdCk7CgkJfQoJfQp9CgokYSA9IG5ldyBTcGxPYmplY3RTdG9yYWdlRXh0ZW5kZWQoKTsKCiRhLT5hdHRhY2gobmV3IEZvbygnZmlyc3QnLCAxKSk7CiRhLT5hdHRhY2gobmV3IEZvbygnc2Vjb25kJywgMSkpOwokYS0+YXR0YWNoKG5ldyBGb28oJ3RoaXJkJywgMCkpOwokYS0+YXR0YWNoKG5ldyBGb28oJ2ZvdXJ0aCcsIDEpKTsKCgokc2VhcmNoID0gJGEtPm9iamVjdEZpbHRlcihhcnJheSgnRm9vJywgJ3NlYXJjaFplcm9UeXBlJykpOwokZG91YmxlID0gJGEtPm9iamVjdE1hcChhcnJheSgnRm9vJywgJ2RvdWJsZVR5cGUnKSwgJGEpOwoKJGEtPm9iamVjdFdhbGsoZnVuY3Rpb24oJG8pIHtlY2hvICRvLT5uYW1lIC4gIiAiO30pOwoKLy9wcmludF9yKCRzZWFyY2gpOw==