【问题标题】:Why is the splat operator not considered an expression?为什么不将 splat 运算符视为表达式?
【发布时间】:2019-08-28 01:41:22
【问题描述】:

我不确定该标题的措辞是否完全正确,但我的 IDE (PHPStorm) 就是这样描述它的。

使用 splat 运算符,我想获取一个如下所示的数组:

array(
    array(
        'label' => 'Some label',
        'value' => 'some-value'
    )
)

并将其转换成如下所示:

array(
    'some-value' => 'Some label'
)

我不熟悉在 PHP 中使用“splat 运算符”,我想知道为什么这段代码被认为是无效的:

$key = ...array_map( function( $el ) {
    return array(
        $el['value'] => $el['label']
    );
}, array(
    array(
        'label' => 'Some label',
        'value' => 'some-value'
    )
) );

但这段代码工作正常,达到了我的目标,但array_merge 完全没有意义:

$key = array_merge( array(), ...array_map( function( $el ) {
    return array(
        $el['value'] => $el['label']
    );
}, array(
    array(
        'label' => 'Some label',
        'value' => 'some-value'
    )
) ) );

用括号括起来似乎没有帮助。这不是 splat 操作员至少部分打算做的吗?不得不通过一个多余的函数来使其工作似乎是一种耻辱。

是否有另一个我不知道的 PHP 函数在没有冗余的情况下做同样的事情?

【问题讨论】:

  • array_combine(array_column($array, 'value'), array_column($array, 'label')); 会达到同样的效果吗?
  • 确实有效,谢谢。我想这会一直持续到传播运算符出现(无论如何对于这个特定的用例)

标签: php


【解决方案1】:

基于此:https://wiki.php.net/rfc/spread_operator_for_array 扩展运算符将在 7.4 中推出。

我们只有参数解包:https://wiki.php.net/rfc/argument_unpacking

【讨论】:

  • 不确定这实际上回答了什么?是的,您是对的,这些链接是相关的,但就其本身而言,这并不能解释任何事情。
猜你喜欢
  • 2015-06-22
  • 1970-01-01
  • 2020-10-22
  • 2020-09-09
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
相关资源
最近更新 更多