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,而不是使用for
和if
的一系列传统结构,但在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
用分组进行连接转换。
*由我开发