关联数组中的PHP三元语句,用于设置密钥和放大器。值?

时间:2015-02-07 04:30:31

标签: php arrays ternary-operator

我一直在搜索和测试一段时间,但是无法找到我想要实现的目标是否可行的方式。

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

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项具有空值是不可接受的,相反,如果初始条件为真,则根本不存在任何元素。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:13)

您对该三元运营商所做的一切就是确定密钥名称。元素将被放入数组中,无论如何,它都在数组文字声明中。

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

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

实际上,你最好写一下:

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

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

答案 1 :(得分:0)

只有通过使声明无效才能实现。

例如,您为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',
    )
);