【问题标题】:A conditional element inside an array(...) constructarray(...) 构造中的条件元素
【发布时间】:2016-08-26 23:54:13
【问题描述】:

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

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

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

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

像这样

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

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

谢谢

    标签: php


    【解决方案1】:

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

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

    条件表达式$cond ? 'v2a' : 'v2b' 将产生'v2a' 如果$cond 计算结果为真的'v2b' 否则。但这仅适用于键的值。

    如果您只想根据条件添加一个键,则需要使用单独的if

    $someConfig = array('k1' => 'v1');
    if ($cond) {
        $someConfig['k2'] = 'v2';
    }
    

    编辑您可以使用array union operatorarray_merge 有条件地添加没有变量的键:

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

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

    【讨论】:

    • 谢谢,意识到这一点,我编辑了我的问题以强调以下内容:目前数组没有名称。仅调节值不是我需要的 - 如果 cond 为假,我需要该对不存在
    【解决方案2】:

    最终我想出了以下几点:

    调用那个函数( 数组(k1 => v1,k2 => v2,... kn=vn)+ ($cond ? array(key=>value) : array()) )

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

    【讨论】:

    • 这非常优雅,尤其是使用 php 5.4+ 方括号数组表示法。例如。 ($cond ? [ key=>value ] : [])
    【解决方案3】:

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

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

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

    【讨论】:

    • 我使用它,但是我想知道是否有任何遍历速记。想想当你有多个层次但需要基于一个级别的父值评估一个条件时,它需要大量额外的输入,例如 ($val['level1']['level2']['level3'] == 'X') ? 'this' : 'that' - 像 (this.parent == 'x') 那样会很漂亮吗? '这个那个'
    【解决方案4】:

    把它放在数组声明之后:

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

    【讨论】:

    • 谢谢,我编辑了我的问题以强调以下几点:目前数组没有名称
    【解决方案5】:

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

    我建议完全设置数组,然后使用 unset 函数删除不需要的数组。这将提供一个干净的数组,其中只包含您想要的内容,并且也易于阅读。

    所以...

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 2014-05-07
      相关资源
      最近更新 更多