3v4l.org

run code in 300+ PHP versions simultaneously
<?php function hasValues(iterable &$value): bool { if (is_array($value)) { return (bool)$value; } if ($value instanceof \Iterator) { return $value->valid(); } $value = $value->getIterator(); return hasValues($value); } $weakMap = new WeakMap(); $x = new stdClass(); $y = new stdClass(); $weakMap[$x] = 'x'; $weakMap[$y] = 'y'; $data = [ [1, 2, 3], [], (fn () => yield from [1, 2, 3])(), (fn () => yield from [])(), new ArrayIterator([1, 2, 3]), new ArrayIterator([]), $weakMap, new WeakMap(), new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/tmp', RecursiveDirectoryIterator::SKIP_DOTS)), ]; foreach ($data as $d) { print_r([ 'value' => $d, 'hasValues' => var_export($hasValues = hasValues($d), true), // Once a generator is checked and does not have any values we can't attempt to iterate it anymore. 'values' => $hasValues ? (is_array($d) ? $d : iterator_to_array($d, false)) : 'null', ]); }
Output for 8.4.1 - 8.4.12
Array ( [value] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [hasValues] => true [values] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) Array ( [value] => Array ( ) [hasValues] => false [values] => null ) Array ( [value] => Generator Object ( [function] => {closure:/in/KDWtR:24} ) [hasValues] => true [values] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) Array ( [value] => Generator Object ( [function] => {closure:/in/KDWtR:25} ) [hasValues] => false [values] => null ) Array ( [value] => ArrayIterator Object ( [storage:ArrayIterator:private] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) [hasValues] => true [values] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) Array ( [value] => ArrayIterator Object ( [storage:ArrayIterator:private] => Array ( ) ) [hasValues] => false [values] => null ) Array ( [value] => WeakMap Object ( [0] => Array ( [key] => stdClass Object ( ) [value] => x ) [1] => Array ( [key] => stdClass Object ( ) [value] => y ) ) [hasValues] => true [values] => Array ( [0] => x [1] => y ) ) Array ( [value] => WeakMap Object ( ) [hasValues] => false [values] => null ) Array ( [value] => RecursiveIteratorIterator Object ( ) [hasValues] => false [values] => null )
Output for 8.1.0 - 8.1.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.25
Array ( [value] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [hasValues] => true [values] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) Array ( [value] => Array ( ) [hasValues] => false [values] => null ) Array ( [value] => Generator Object ( ) [hasValues] => true [values] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) Array ( [value] => Generator Object ( ) [hasValues] => false [values] => null ) Array ( [value] => ArrayIterator Object ( [storage:ArrayIterator:private] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) [hasValues] => true [values] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) Array ( [value] => ArrayIterator Object ( [storage:ArrayIterator:private] => Array ( ) ) [hasValues] => false [values] => null ) Array ( [value] => WeakMap Object ( [0] => Array ( [key] => stdClass Object ( ) [value] => x ) [1] => Array ( [key] => stdClass Object ( ) [value] => y ) ) [hasValues] => true [values] => Array ( [0] => x [1] => y ) ) Array ( [value] => WeakMap Object ( ) [hasValues] => false [values] => null ) Array ( [value] => RecursiveIteratorIterator Object ( ) [hasValues] => false [values] => null )

preferences:
60.96 ms | 415 KiB | 5 Q