如果关联数组中不存在某个键,设置默认值的函数是什么?

7

如果PHP中的变量未设置,是否有一种函数可以设置其默认值? 有一些内置函数可用于替换以下内容:

$myFruit = isset($_REQUEST['myfruit']) ? $_REQUEST['myfruit'] : "apple" ;
5个回答

9

PHP 有一个操作符可以实现这个功能(从5.3版本开始),将您的示例压缩为:

$myFruit = $_REQUEST['myfruit'] ?: "apple";

然而,我说“有点儿”是因为它仅测试第一个操作数是否为假,并且如果未设置,则不会抑制通知。因此,如果(如在您的示例中)可能未设置,则您的原始代码最好。

类似于字典.get的函数非常简单:

function dget($dict, $key, $default) {
    return isset($dict[$key]) ? $dict[$key] : $default;
}

为了清晰起见,我仍然会使用您的原始代码。

编辑:ifsetor()的用户级实现#2,位于http://wiki.php.net/rfc/ifsetor上,比上述函数更整洁,并且也适用于非数组,但具有相同的注意点,即默认表达式始终会被评估,即使不使用它:

function ifsetor(&$variable, $default = null) {
    if (isset($variable)) {
        $tmp = $variable;
    } else {
        $tmp = $default;
    }
    return $tmp;
}

我也写了一个类似的函数,只是好奇是否有一些简单的内置函数我没有注意到。 - DhruvPathak

1
据我所知,在PHP中并不存在这样的东西。
你可以自己实现类似的功能,例如:
$myVar = "Using a variable as a default value!";

function myFunction($myArgument=null) {
    if($myArgument===null)
        $myArgument = $GLOBALS["myVar"];
    echo $myArgument;
}

// Outputs "Hello World!":
myFunction("Hello World!");
// Outputs "Using a variable as a default value!":
myFunction();
// Outputs the same again:
myFunction(null);
// Outputs "Changing the variable affects the function!":
$myVar = "Changing the variable affects the function!";
myFunction();

全局变量是一种编码味道。你应该避免使用它。无论如何,这似乎只能与现有变量一起工作(myFunction($x)仍然会抛出一个提示),或者静态(硬编码)值。 - KingCrunch

1
您还可以创建一个实现ArrayAccess接口的类,在构造期间传递2个数组($_REQUEST和一个带有默认值的数组),并使其透明地选择默认值。
顺便说一下,依赖$_REQUEST并不是一个明智的做法。有关更多信息,请参阅$_REQUEST手册。

我的问题一般适用于所有的关联数组,这里只是举例使用了 $_REQUEST。 - DhruvPathak
是的,我只是想确保提到了 $_REQUEST 的问题,因为它出现在问题中。 - tobyS

0

如果一个键不存在,而你需要返回一个默认值,你可以在访问之前将数组填充为这些值,而不是进行测试。

$expectedKeys = array('myfruit');
$requestData = array_merge (
  array_combine(
    $expectedKeys,
    array_fill(0, count($expectedKeys), null)),
  $_REQUEST);

$postData现在是一个包含所有你期望的键(由$expectedKeys指定)的数组,但任何在$_REQUEST中缺失的条目将会是null

$myFruit = $requestData['myfruit'];
if (is_null($myFruit)) {
  // Value not exists
}

但我也建议只使用三元操作符?:


-1

在你可以避免的情况下,使用@来抑制错误从来不是一个好主意。然而:与isset($variable) ? $variable : 'default'有什么区别? - KingCrunch
1
这比原始代码更长,并使用错误抑制(不好!) - Long Ears
@KingCrunch,我认为没有区别,通常编码指南不允许使用?:“风格”。但我更喜欢它,因为它更短,而且在我看来易读。 - powtac
@缺乏想法,是我的错,我改变了示例用法。 - powtac
如果您格式化您的代码,三元运算符与其他运算符一样易读。其次,对于其他人(-->非CakePHP开发者/用户),这个众所周知的运算符更加直观。最后,仅仅为了节省4个字符(如果您省略每个空格,那么只有2个字符),使用函数而不是运算符是一个错误的论点。另外:在您编辑后(删除@运算符)它将在应该帮助开发人员的情况下抛出通知。 - KingCrunch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接