2017-06-16 11 views
4

PHP 7.1がthe iterable pseudo-typeを導入したことをとてもうれしく思っています。PHPが配列やトラバーサルに反復可能

このタイプのパラメータをループするだけのときには大丈夫ですが、arrayまたは単にTraversableを受け入れるPHP関数に渡す必要がある場合は、どうすればよいかわかりません。たとえば、array_diffを実行し、iterableTraversableの場合、arrayが表示されます。逆に、反復子をとる関数を呼び出すと、iterablearrayの場合はエラーになります。

iterable_to_array(NOT:iterator_to_array)とiterable_to_traversableのようなものがありますか?

私は、この違いを処理するために私の関数内の条件文を避け、自分自身のグローバル関数を定義することに依存しないソリューションを探しています。 PHP 7.1

答えて

4

ない、これはあなたが探しているものであるが、これはそれを行うための最短の道であることを確認を使用して

$array = []; 
array_push ($array, ...$iterable); 

私はそれがなぜ機能するのかよく分かりません。ただ、私はあなたの質問が面白い発見し、私は完全な例PHP

をいじる開始:

<?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()); 

これは、関数array()で動作する場合はいいですが、それは言語構造であるため、ことは少し特別であるだろう。また、assoc配列のキーも保持しません。

+1

これは、array_pushがさまざまな量の引数をとり、...を使用してiterableを引数のリストにアンパックするため、これが機能します。スコープに余分な変数を導入してからそれを変更する必要があるため、私には受け入れられる解決策ではありません。 –

+0

@JeroenDeDauw私はそれを知っています...それを展開しますが、array()では同じように動作しないので、何か変なことがあります。私はそれが容認できる解決策ではないことに同意する、実際には、私はそれが7.1では不可能だと思うが、私は限界(機能を定義して条件を使用しない) –

1

iterable_to_arrayとiterable_to_traversable

ちょうどどこかに、彼らは多くのスペースを取るし、あなたがを求め、正確なAPIを与えていないプロジェクトにこれらを追加するようなものがあります。

function iterable_to_array(iterable $it): array { 
    if (is_array($it)) return $it; 
    $ret = []; 
    array_push($ret, ...$it); 
    return $ret; 
} 

function iterable_to_traversable(iterable $it): Traversable { 
    yield from $it; 
} 
関連する問題