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

要得到:

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

反正有没有在PHP中获得类似的列表理解语法? 有没有办法用PHP 5.3的任何新function呢?

谢谢!

也许这样?

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

这将工作在PHP 5.3+,在一个较旧的版本中,你必须分别定义array_map的callback

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

PHP 5.5可能支持列表parsing – 请参阅邮件列表公告:

  • [PHP-DEV] PHP的列表推导和生成器expression式 (2012年6月28日)

并进一步讨论:

  • 什么发电机可以为你做 (通过ircmaxell; 2012年7月23日) – 有一个斐波纳契的例子。
  • 什么PHP 5.5可能看起来像 (由NikiC; 2012年7月10日)
  • 征求意见:发电机 (维基于2012年6月5日开始)

在.NET中,相当于Python的“语法上甜美的列表parsing”是LINQ。 在PHP中,有几个端口,包括YaLinqo library *。 从语法上来说,它更接近于SQL,而不是使用forif的一系列传统结构,但在function上它是相似的:

 $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; }的快捷方式function ($v) { return $v * $v; } function ($v) { return $v * $v; }这个库支持。 不幸的是,PHP不支持closures的简短语法,但是可以使用这种“stringlambdas”来缩短代码。

还有更多的方法,从where开始( if等价的话),以groupJoin结尾, groupJoin用分组进行连接转换。

*由我开发