【问题标题】:equivalent of dict comprehensions in PHP相当于 PHP 中的 dict 理解
【发布时间】:2016-05-14 16:53:37
【问题描述】:

我正在寻找以下 Python 代码在 PHP 中的等价物:

d = {a*2:a*3 for a in range(5)}

这是一个丑陋的单行解决方案:

$d = array_combine(array_map(function ($x) {return $x*2;}, range(0,4)), array_map(function ($x) {return $x*3;}, range(0,4)));

这是一个使用循环的更具可读性的解决方案:(

$d = [];
foreach(range(0,4) as $x) {
    $d[$x*2]  = $x*3;
}

在 PHP 中有没有更简单更好的方法来做到这一点?

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/1266911/…
  • foreach 是您案例中最简单的解决方案
  • python 代码也使用循环.."使用循环:("..for a in range(5) 这是一个循环..
  • @ern 你说得对——我想我在想别的东西——例如在python中使用join而不是在for循环中连接字符串更好的方式(即占用更少的资源)。我也有这样的印象,列表/字典理解在计算上更可取。但我不知道它是如何与 php 中的数组一起工作的,所以也许它与循环而不是像 array_map 这样的东西一样有效。

标签: php arrays


【解决方案1】:

PHP 中没有字典解析语法。当寻找最短和/或最有效的代码来产生相同的输出时,我会建议:

1。范围(从,到,步骤)

你可以利用range函数的第三个参数:

$d = array_combine (range(0,8,2), range(0,12,3));

var_export($d)的输出:

array (
  0 => 0,
  2 => 3,
  4 => 6,
  6 => 9,
  8 => 12,
)

当然,这只适用于你的表达式是线性的。

2。 foreach

foreach 循环确实是处理这个问题的最简洁和最易读的方法。请注意,您的版本有一个小错误:range 函数需要至少 2 个参数。

另外,PHP 不需要您初始化 $d,因为它会在循环中的第一次赋值时这样做。最后,您不需要大括号,尽管您喜欢的编码风格可能需要使用它们:

foreach (range(0,4) as $x) $d[$x*2] = $x*3;

这一行的字符数比第一个解决方案还要短。

【讨论】:

  • 那很好.. 实际上在 php 中没有字典解析或列表解析的等价物.. keeponcoding.com/… .. 这仍然是他能做的最好的事情之一..
  • 谢谢,@ern,你当然是对的:PHP 没有等价物。我在答案的顶部添加了这个事实,并添加了 2 个替代方案。
  • 谢谢!第一个解决方案很聪明,但无济于事,因为我更改了函数等,以使问题在我的应用程序上下文之外更易于陈述。第二个看起来很棒——我想要一个可读的单行。 @ern 感谢该链接,它很有帮助。
猜你喜欢
  • 2012-05-27
  • 1970-01-01
  • 2021-07-11
  • 2018-01-12
  • 2015-04-22
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多