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中的任何新特性都可以做到这一点吗?

谢谢!

22213 次浏览

Maybe something like this?

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

This will work in PHP 5.3+, in an older version you'd have to define the callback for array_map separately

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

PHP 5.5 may support list comprehensions - see the mailing list announcement:

And further discussion:

In .NET, the equivalent of Python's "syntactically sweet list comprehensions" is LINQ. And in PHP, there're several ports of it, including YaLinqo library*. Syntactically, it's closer to SQL rather than a sequence of traditional constructs with for and if, but functionally, it's similar:

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

This produces an iterator which can either be output to console:

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

or iterated over using foreach:

foreach ($a as $i)
echo $i, PHP_EOL;

Here, '$v * $v' is a shortcut for function ($v) { return $v * $v; } which this library supports. Unfortunately, PHP doesn't support short syntax for closures, but such "string lambdas" can be used to make the code shorter.

There're many more methods, starting with where (if equivalent) and ending with groupJoin which performs joining transformation with grouping.

* developed by me