PHP是否具有与Python的列表理解语法等效的功能?


76

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的任何新功能都可以做到吗?

谢谢!


1
我想说一个更好的例子,说明条件列表对Python列表的理解有多么出色!x = [x * 2表示x在range(1,9)中,如果x <3]或无法通过数组映射完成的任何下注!
乔纳森

1
另请参阅:将变量传递到匿名函数stackoverflow.com/questions/11420520/…–
dreftymac

Answers:


87

也许是这样的吗?

$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
好答案。+1。列表理解不完全是,但这是一个非常优雅且简短的解决方案。请注意,这是PHP 5.3+,因为使用了匿名函数。
Lior Cohen 2009年

4
需要PHP 5.3。但是很好的解决方案:)
塞巴斯蒂安·霍伊茨

1
对于理解而言,它比map,reduce和filter操作更为方便。对于array_map,array_reduce和array_filter之间的问题,您可以拥有所有内容,使用_invoke()魔术方法的精简库,您可以全面了解_pretty功能API。
Saem

1
可以与A构造函数一起使用吗?array_map("new MyClass", range(0,9))
Thomas Ahle

1
实际上,这不是列表理解。(Python也具有map功能。)尽管map与列表理解相似。
13年

6

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

并进一步讨论:


5
对于那些现在阅读此评论的人:PHP 5.5(或5.6)不包含列表推导。它确实包括发电机。
赫斯基2015年

PHP 7呢?
乔纳森

抱歉,我不认为PHP7会添加任何有关列表理解的内容。
David Goodwin,


0

在.NET中,相当于LINQ是Python的“语法上甜美的列表理解”。在PHP中,有多个端口,包括YaLinqo库*。从语法上讲,它更接近于SQL,而不是使用for和组成的一系列传统构造if,但在功能上类似:

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

还有更多方法,从whereif等价)开始,到groupJoin以分组执行联接转换的结束。

*由我开发

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.