【问题标题】:Does PHP have an equivalent to Python's list comprehension syntax?PHP 是否具有与 Python 的列表理解语法等价的功能?
【发布时间】:2010-11-19 00:14:14
【问题描述】:

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

谢谢!

【问题讨论】:

  • 我想说一个更好的例子来说明 python 列表理解是多么棒的是条件! x = [x*2 for x in range(1,9) if x
  • 另见:将变量传递给匿名函数stackoverflow.com/questions/11420520/…

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


【解决方案1】:

也许是这样的?

$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。不完全是列表理解,但它仍然是一个非常优雅和简短的解决方案。请注意,这是 PHP 5.3+,因为使用了匿名函数。
  • 需要 PHP 5.3。但是很好的解决方案:)
  • 因为推导比 map、reduce 和 filter 操作更方便。对于 array_map、array_reduce 和 array_filter 之间的问题,您可以拥有一切,一个使用 _invoke() 魔术方法的瘦库,您可以获得完整的 _pretty 功能 API。
  • 你能把这个和A构造函数一起使用吗? array_map("new MyClass", range(0,9))?
  • 其实这不是列表理解。 (Python 也有 map 函数。)虽然 map 和列表理解是相似的。
【解决方案2】:

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

还有进一步的讨论:

【讨论】:

  • 对于现在阅读此评论的人:PHP 5.5(或 5.6)不包括列表推导。它确实包括生成器。
  • PHP 7 怎么样?
  • 抱歉,我认为 PHP7 没有添加任何关于列表解析的内容。
【解决方案3】:

不是开箱即用,而是看一下: http://code.google.com/p/php-lc/http://code.google.com/p/phparrayplus/

【讨论】:

    【解决方案4】:

    在 .NET 中,相当于 Python 的“语法甜美列表推导”的是 LINQ。在 PHP 中,它有几个端口,包括 YaLinqo library*。从语法上讲,它更接近于 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”来缩短代码。

    还有更多方法,以where(等效if)开始,以groupJoin 结束,它执行与分组的连接转换。

    *我开发的

    【讨论】:

      猜你喜欢
      • 2017-12-30
      • 2019-05-10
      • 2012-09-19
      • 2011-11-27
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 2011-02-28
      • 2011-12-02
      相关资源
      最近更新 更多