PHP 将数组传递给函数 - 如果未设置,则保持默认值
Posted
技术标签:
【中文标题】PHP 将数组传递给函数 - 如果未设置,则保持默认值【英文标题】:PHP Pass Array to function - Maintain default values if not set 【发布时间】: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
功能?如果结果为假,您可以随时在此处手动设置变量。
如果没有办法维持默认设置,我倾向于这样做。我们只是在处理大量传入的“潜在”选项,并试图避免检查每个选项
【参考方案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
【讨论】:
如果传递的数组只有三个必需选项中的一个或两个,它仍然会通过你的条件。以上是关于PHP 将数组传递给函数 - 如果未设置,则保持默认值的主要内容,如果未能解决你的问题,请参考以下文章
使用 AJAX 将复选框值 1 如果选中,如果不是 0 传递给 PHP