关联数组中的PHP三元语句来设置键和值?
Posted
技术标签:
【中文标题】关联数组中的PHP三元语句来设置键和值?【英文标题】:PHP Ternary statement within Associative Array to set both key & value? 【发布时间】: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 @奥斯汀
【参考方案1】:
你对三元运算符所做的只是决定键名。无论如何,该元素都会被放入数组中,它就在数组字面量声明中。
使用内联表达式可以做的最好的事情是这样的:
['foo' => 'bar'] + (true ? [] : ['baz' => 42])
实际上,你应该写得更好:
$arr = ['foo' => 'bar'];
if (true)
$arr['baz'] = 42;
编写更紧凑的代码并不总是最好的目标,首先它需要可读性和可理解性。
【讨论】:
因为这是在 php-5.3 下标记的,最好不要使用仅在 5.4+ 中可用的短数组语法。但答案仍然是正确的。 谢谢,我用了第二种方法,代码仍然读得干净! “无论如何”是这里的重点。你可以让它失败:***.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://***.com/a/29327671/367456
*/
var_dump(
Array(
'Item 1' => 'Some value',
TRUE ? array() : 'Item 2' => 'Another Value',
FALSE ? array() : 'Item 3' => 'Just Another Value',
)
);
【讨论】:
这真的很神奇,即使你永远不应该这样做。以上是关于关联数组中的PHP三元语句来设置键和值?的主要内容,如果未能解决你的问题,请参考以下文章