web-dev-qa-db-ja.com

PHPには、Pythonのリスト内包構文と同等のものがありますか?

Pythonには構文的にはスイートリストの内包表記があります。

S = [x**2 for x in range(10)]
print S;
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

PHPでは、ループを行う必要があります:

$output = array();
$Nums = range(0,9);

foreach ($Nums as $num) 
{
    $out[] = $num*=$num;
}
print_r($out);

取得するため:

配列([0] => 0 [1] => 1 [2] => 4 [3] => 9 [4] => 16 [5] => 25 [6] => 36 [7] => 49 [8] => 64 [9] => 81)

PHPで同様のリスト内包構文を取得する方法はありますか?とにかく、PHP 5.3の新機能のいずれかでそれを行うことはありますか?

ありがとう!

68
Darren Newton

たぶんこんな感じ?

$out=array_map(function($x) {return $x*$x;}, range(0, 9))

これはPHP 5.3+で機能します。古いバージョンでは、個別に array_map のコールバックを定義する必要がありました。

function sq($x) {return $x*$x;}
$out=array_map('sq', range(0, 9));
77
Paul Dixon

PHP 5.5はリスト内包表記をサポートしているかもしれません-メーリングリストのアナウンスをご覧ください:

そしてさらなる議論:

5
David Goodwin

そのままではなく、次をご覧ください: http://code.google.com/p/php-lc/ または http://code.google.com/ p/phparrayplus /

2
Rufinus

.NETでは、Pythonの「構文的に甘いリスト内包表記」に相当するのがLINQです。そして、PHPには YaLinqo library *を含むいくつかの移植版があります。構文的には、forifを使用した従来のコンストラクトのシーケンスではなく、SQLに近くなりますが、機能的には次のようになります。

_$a = Enumerable::range(0, 10)->select('$v * $v');
_

これにより、コンソールに出力できるイテレータが生成されます。

_var_dump($a->toArray()); // by transforming the iterator to an array
echo $a->toString(', '); // or by imploding into a string
_

またはforeachを使用して繰り返し:

_foreach ($a as $i)
    echo $i, PHP_EOL;
_

ここで、_'$v * $v'_は、このライブラリがサポートするfunction ($v) { return $v * $v; }のショートカットです。残念ながら、PHPはクロージャーの短い構文をサポートしていませんが、そのような「文字列ラムダ」を使用してコードを短くすることができます。

whereifと同等)で始まり、groupJoinで終わるメソッドが他にもたくさんあります。これは、グループ化による結合変換を実行します。

*私が開発

0
Athari