PHP是否具有Python的列表推导语法?

时间:2009-08-12 15:26:08

标签: php arrays list-comprehension higher-order-functions language-comparisons

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中的任何新功能吗?

谢谢!

4 个答案:

答案 0 :(得分:75)

也许是这样的?

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

答案 1 :(得分:5)

PHP 5.5可能支持列表推导 - 请参阅邮件列表公告:

进一步讨论:

答案 2 :(得分:2)

答案 3 :(得分:0)

在.NET中,相当于Python的“语法上的甜蜜列表理解”是LINQ。在PHP中,有几个端口,包括YaLinqo库*。从语法上讲,它更接近于SQL,而不是具有forif的传统结构序列,但在功能上,它是相似的:

$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不支持闭包的短语法,但可以使用这种“字符串lambdas”来缩短代码。

还有更多方法,从whereif等效)开始,到groupJoin结束,通过分组执行加入转换。

*由我开发