1--TEST-- 2RecursiveCallbackFilterIterator with trampoline callback 3--FILE-- 4<?php 5 6function test($value, $key, $inner) { 7 if ($inner->hasChildren()) { 8 return true; 9 } 10 printf("%s / %s / %d / %d\n" 11 , print_r($value, true) 12 , $key 13 , $value == $inner->current() 14 , $key == $inner->key() 15 ); 16 return $value === 1 || $value === 4; 17} 18 19class TrampolineTest { 20 public function __call(string $name, array $arguments) { 21 echo 'Trampoline for ', $name, PHP_EOL; 22 return test(...$arguments); 23 } 24} 25$o = new TrampolineTest(); 26$callback = [$o, 'trampoline']; 27 28$it = new RecursiveArrayIterator([1, [2, 3], [4, 5]]); 29$it = new RecursiveCallbackFilterIterator($it, $callback); 30$it = new RecursiveIteratorIterator($it); 31 32foreach($it as $value) { 33 echo "=> $value\n"; 34} 35?> 36--EXPECT-- 37Trampoline for trampoline 381 / 0 / 1 / 1 39=> 1 40Trampoline for trampoline 41Trampoline for trampoline 422 / 0 / 1 / 1 43Trampoline for trampoline 443 / 1 / 1 / 1 45Trampoline for trampoline 46Trampoline for trampoline 474 / 0 / 1 / 1 48=> 4 49Trampoline for trampoline 505 / 1 / 1 / 1 51