【问题标题】:PHP Pass Array to function - Maintain default values if not setPHP 将数组传递给函数 - 如果未设置,则保持默认值
【发布时间】:2015-07-26 13:20:30
【问题描述】:

我有一个函数,它接受一个“选项”参数数组来设置查询数据库的标志。看起来是这样的

function c_SQL($SQL='', $FIELDS=array(), $OPTIONS=array('SINGLEROW'=>false,'foo'=>false,'bar'=>false)) {

}

如果我没有在函数调用中设置默认数组键,我会尝试维护它们:

$test = c_SQL($query,$fields,array('SINGLEROW'=>true));

当我们检查未指定的数组键(foo 和 bar)时,这会在 c_SQL 函数内部产生错误。

如果没有指定,有没有办法维护 'foo' 和 'bar' 并且只有在传递到函数时才更改键?

【问题讨论】:

  • 您是否尝试过使用isset 功能?如果结果为假,您可以随时在此处手动设置变量。
  • 如果没有办法维持默认设置,我倾向于这样做。我们只是在处理大量传入的“潜在”选项,并试图避免检查每个选项

标签: php arrays function default-value


【解决方案1】:

您可以在函数内部使用array_merge 与函数内部定义的默认数组合并。

function c_SQL($SQL = '', $FIELDS=array(), $OPTIONS = array()) {
    $defaults =  array(
        'SINGLEROW' => false,
        'foo' => false,
        'bar' => false  
    );
    $OPTIONS = array_merge($defaults, $OPTIONS);
    return $OPTIONS;
}

#  array ( 'SINGLEROW' => false, 'foo' => false, 'bar' => false, )
var_export(c_SQL());

# array ( 'SINGLEROW' => true, 'foo' => false, 'bar' => false, )
var_export(c_SQL(array('SINGLEROW' => true)));

【讨论】:

    【解决方案2】:

    您可以将默认值保持为常量,并使用array_merge 将它们应用于用户的输入:

    $DEFAULT_OPTIONS = array('SINGLEROW'=>false,'foo'=>false,'bar'=>false);
    function c_SQL($sql='', $fields=array(), $options=array()) {
        $actual_options = array_merge($default_options, $options);
    }
    

    【讨论】:

    • 很好的建议!我喜欢这个想法,因为它只会覆盖他们指定的那些。
    • @BryanZwicker 这看起来不错,但我认为 $default_options 在调用 $options 之前应该放在 array_merge 之前,因为第二个数组会覆盖第一个数组,并且您希望新选项覆盖默认值.
    • @Andrew 我总是把事情搞混了 ;-( 不过你是对的 - 我相应地修正了答案。谢谢!
    • 我在查看 array_merge() 的文档时注意到了。我认为这只是一个伪代码疏忽 :) 再次感谢!
    • $default_options 应该在函数的范围内。它在其他任何地方都没有用,并且有未来与另一个变量发生冲突的风险。查看我的解决方案。
    【解决方案3】:

    在函数体内创建默认选项,然后将新选项与array_merge 合并

    function c_SQL($SQL='', $FIELDS=array(), $OPTIONS=array()) {
        $DEFAULTS = array('SINGLEROW'=>false,'foo'=>false,'bar'=>false);
        $OPTIONS = array_merge($DEFAULTS, $OPTIONS);
    }
    

    【讨论】:

    • 感谢您的建议!我喜欢这种方法,它完全完成了我想要做的事情。 @Mureinik 领先你几秒钟,但 +1
    【解决方案4】:

    尝试将$OPTIONS 分配为null 或空数组,然后在函数中检查它是否为空,如果为空则分配数组。看看这里..

    function c_SQL($SQL='', $FIELDS=array(), $OPTIONS=NULL) {
        if(empty($OPTIONS) {
            $OPTIONS=array('SINGLEROW'=>false,'foo'=>false,'bar'=>false)
        } else {
           $othervalues = array('SINGLEROW'=>false,'foo'=>false,'bar'=>false);
           $OPTIONS = array_merge($othervalues, $OPTIONS);
           //do something here
        }
    }
    

    【讨论】:

    • 如果传递的数组只有三个必需选项中的一个或两个,它仍然会通过你的条件。
    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 2022-11-02
    • 2015-01-11
    • 2013-04-12
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多