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

she*_*iel 16 php

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

callThatFunction( array(k1 => v1,  k2 => v2, ... kn=vn));
Run Code Online (Sandbox Code Playgroud)

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

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

像这样

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

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

谢谢

Gum*_*mbo 36

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

$someConfig = array(
    'k1' => 'v1',
    'k2' => $cond ? 'v2a' : 'v2b'
);
Run Code Online (Sandbox Code Playgroud)

如果计算结果为true,则条件表达式$cond ? 'v2a' : 'v2b'将产生.但这仅适用于密钥的值.'v2a'$cond'v2b'

如果您只想根据条件添加密钥,则需要使用单独的if:

$someConfig = array('k1' => 'v1');
if ($cond) {
    $someConfig['k2'] = 'v2';
}
Run Code Online (Sandbox Code Playgroud)

编辑     您可以使用数组union运算符有条件地添加键而不使用变量,或者array_merge:

array('k1' => 'v1') + ($cond ? array('k2' => 'v2') : array())
array_merge(array('k1' => 'v1'), $cond ? array('k2' => 'v2') : array())
Run Code Online (Sandbox Code Playgroud)

现在,您需要确定哪些内容更易读或更易于维护.


GWW*_*GWW 7

把它放在数组声明之后:

$someConfig = array(
...
);

if($cond){ $someConfig['k2'] = $v2; }
Run Code Online (Sandbox Code Playgroud)


she*_*iel 6

最终我想出了以下几点:

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

仍然会欣赏对更直接表达意图的建议

  • 这非常优雅,尤其是使用 php 5.4+ 方括号数组表示法。例如。($cond ? [ 键=>值 ] : []) (2认同)

bil*_*oah 6

您可以像这样一次分配所有值并从数组中过滤空键:

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

这使您可以避免事后的条件,并且它具有相当的可读性。