数组(...)构造中的条件元素

时间:2010-11-07 17:44:34

标签: php

我的系统将配置数组发送到这样的函数:

callThatFunction( array(k1 => v1,  k2 => v2, ... kn=vn));

我想根据某些情况制作其中一个关键值对。

我是否可以在不为数组创建变量的情况下执行此操作(这打破了其他人创建的干净配置语法)?

喜欢这个

callThatFunction ( array(
k1 => v1, 
if($cond( {k2 => v2,} 
... 
kn=vn));

上述语法在语法上显然是错误的,但应该表达我的想法。

谢谢

5 个答案:

答案 0 :(得分:34)

您可以使用条件运算符cond ? true-expr : false-expr

$someConfig = array(
    'k1' => 'v1',
    'k2' => $cond ? 'v2a' : 'v2b'
);

如果$cond ? 'v2a' : 'v2b'评估为 true ,则条件表达式'v2a'将产生$cond,否则将'v2b'if但这仅适用于密钥的值。

如果您只想根据条件添加密钥,则需要使用单独的$someConfig = array('k1' => 'v1'); if ($cond) { $someConfig['k2'] = 'v2'; }

array('k1' => 'v1') + ($cond ? array('k2' => 'v2') : array())
array_merge(array('k1' => 'v1'), $cond ? array('k2' => 'v2') : array())

修改您可以使用array union operatorarray_merge来无条件地添加密钥:

{{1}}

现在你需要决定什么是更可读或更好的维护。

答案 1 :(得分:6)

将它放在数组声明之后:

$someConfig = array(
...
);

if($cond){ $someConfig['k2'] = $v2; }

答案 2 :(得分:2)

最终我想出了以下内容:

callThatFunction( 数组(k1 => v1,k2 => v2,... kn = vn) +($ cond?array(key => value):array()) )

对于能够更直接表达意图的某些事情仍然会有所建议

答案 3 :(得分:2)

您可以像这样分配所有值并从阵列中过滤空键:

$myArray = array_filter([
    'k1' => 'v1',
    'k2' => $cond ? 'v2' : false
]);

这允许你在事后避免条件,并且它具有相当的可读性。

答案 4 :(得分:1)

我认为到目前为止所有这些答案都会在不满足条件时在数组中留下某种存根。

我建议完整设置数组,然后使用未设置功能删除您不想要的内容。这将提供一个干净的数组,只有你想要的东西,也很容易阅读。

因此...

$shapes = array('one'=>'circle, 'three'=>'triangle, 'four'=>'square', 'five'=>'pentagon')
if($i_like_curves==false){
   unset($shapes['one']);
}