I'm quite happy that PHP 7.1 introduced the iterable pseudo-type.
Now while this is great when just looping over a parameter of this type, it is unclear to me what to do when you need to pass it to PHP functions that accept just an array
or just a Traversable
. For instance, if you want to do an array_diff, and your iterable
is a Traversable
, you will get an array
. Conversely, if you call a function that takes an Iterator, you will get an error if the iterable
is an array
.
Is there something like iterable_to_array
(NOT: iterator_to_array
) and iterable_to_traversable
?
I'm looking for a solution that avoids conditionals in my functions just to take care of this difference, and that does not depend on me defining my own global functions.
Using PHP 7.1
Not sure this is what are you searching for but this is the shortest way to do it.
$array = [];
array_push ($array, ...$iterable);
I'm not very sure why it works. Just I found your question interesting and I start fiddling with PHP
Full example:
<?php
function some_array(): iterable {
return [1, 2, 3];
}
function some_generator(): iterable {
yield 1;
yield 2;
yield 3;
}
function foo(iterable $iterable) {
$array = [];
array_push ($array, ...$iterable);
var_dump($array);
}
foo(some_array());
foo(some_generator());
It would be nice if works with function array()
, but because it is a language construct is a bit special. It also doesn't preserve keys in assoc arrays.