PHP iterable to array or Traversable

Jeroen De Dauw picture Jeroen De Dauw · Jun 16, 2017 · Viewed 7.8k times · Source

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

Answer

Edwin Rodríguez picture Edwin Rodríguez · Jun 16, 2017

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.