【问题标题】:PHP Ternary statement within Associative Array to set both key & value?关联数组中的PHP三元语句来设置键和值?
【发布时间】:2015-04-07 08:23:53
【问题描述】:

我已经搜索和测试了一段时间,只是找不到我想要完成的事情是否可以按照我的方式进行。

我想在定义数组时基于三元语句向数组添加键/值对。

Array(
    'Item 1' => 'Some value',
    (FALSE)? NULL : 'Item 2' => 'Another Value'
)

我的预期/想要的行为是结果是:

Array (
  [Item 1] => Some value
  [Item 2] => Another Value
)

当陈述为真时:

Array(
    'Item 1' => 'Some value',
    (TRUE)? NULL : 'Item 2' => 'Another Value'
)

产量:

Array (
  [Item 1] => Some value
)

但是我得到了:

Array (
  [Item 1] => Some value
  [] => Another Value
)

这会导致问题,因为 A)我不希望第二个元素首先存在,B)将 False 条件值分配给 True 条件值(在本例中为 NULL,它将键设置为 NULL [ ])

这很奇怪。我唯一的选择是有一个标准的 if(){} 语句并在条件为假时将元素弹出(通过使用!)到数组中?

注意:第 2 项的值为空是不可接受的,如果初始条件为真,则根本不应该存在任何元素。

任何帮助将不胜感激!

【问题讨论】:

  • 99% 确定这是不可能的,也就是说,您需要使用 if。我会再考虑一下,看看我能不能做得更好。
  • 不可能。要么将元素添加到数组中,要么不添加;没有办法像这样有条件地做到这一点。无论如何,使用if 语句到底有什么问题......?它完美地完成了这项工作(有些人甚至会说它比三元更直观)。
  • 它实际上是is possible,但你通常不想这样做。 /cc @奥斯汀

标签: php arrays ternary-operator


【解决方案1】:

你对三元运算符所做的只是决定键名。无论如何,该元素都会被放入数组中,它就在数组字面量声明中。

使用内联表达式可以做的最好的事情是这样的:

['foo' => 'bar'] + (true ? [] : ['baz' => 42])

实际上,你应该写得更好:

$arr = ['foo' => 'bar'];
if (true) {
    $arr['baz'] = 42;
}

编写更紧凑的代码并不总是最好的目标,首先它需要可读性和可理解性。

【讨论】:

  • 因为这是在 php-5.3 下标记的,最好不要使用仅在 5.4+ 中可用的短数组语法。但答案仍然是正确的。
  • 谢谢,我用了第二种方法,代码仍然读得干净!
  • “无论如何”是这里的重点。你可以让它失败:stackoverflow.com/a/29327671/367456 :)
  • @MáximaAlekz 如果你暗示不可读的版本更快:它不是。其次,谷歌和 Facebook 都在大力投资自己的语言和/或编译器;他们正在解决编译器级别的性能问题,而不是代码级别(很明显)。此外,鉴于两家公司都拥有庞大的团队规模和代码库,我相信可维护性(包括可读性)对他们来说非常重要。
【解决方案2】:

只有通过使语句无效才能实现。

例如,您为 PHP 无法处理的键(例如数组)获取一个值,并且当您不想添加条目时,您使用该键。

原理实际上类似于您使用NULL 值概述的内容:

Array(
    'Item 1' => 'Some value',
    TRUE ? array() : 'Item 2' => 'Another Value'
)

这样做的缺点是代码庞大,阅读不清晰并给出警告:

警告:非法偏移类型

所以为了完整起见,我添加了更多这个答案。

完整示例 (online demo):

<?php
/**
 * PHP Ternary statement within Associative Array to set both key & value?
 * @link http://stackoverflow.com/a/29327671/367456
 */

var_dump(
    Array(
        'Item 1'                   => 'Some value',
        TRUE  ? array() : 'Item 2' => 'Another Value',
        FALSE ? array() : 'Item 3' => 'Just Another Value',
    )
);

【讨论】:

  • 这真的很神奇,即使你永远不应该这样做。
猜你喜欢
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 2010-12-22
  • 2019-05-11
  • 2011-09-30
相关资源
最近更新 更多