检查变量是否设置并为其赋值或设置默认值的最有效方法是什么?


What is the most effecient way to check if a variable isset and to assign its value or set a default value?

我有一个很长的多维数组值,它可能存在,也可能不存在。

在不重复引用多维数组的情况下,检查它是否已设置、使用它的值或使用替代值的最有效方法是什么?

在这里你可以看到长数组被引用了两次,这可以避免吗?

$source = null;
$default = 'something';
if(isset($request['controller']['options']['data']['source'])) {
    $source = $request['controller']['options']['data']['source'];
} else {
    $source = $default;
}
$source = null;
$default = 'something';
if(isset($request['controller']['options']['data']['source']) && $request['controller']['options']['data']['source']) {
    $source = $request['controller']['options']['data']['source'];
} else {
    $source = $default;
}

如果你不想按照我在评论中所说的那样做,或者你想避免你正在做的事情,还有另一种方法。

(isset($request['controller']['options']['data']['source'])) ? $source = $request['controller']['options']['data']['source']
        : ($source = $default);

This

$your_variable = $request['controller']['options']['data']['source'];
如果任何键不存在,

将导致警告。这样是行不通的。我认为最好的方法是创建一个辅助方法来实现

<?php
/**
 * Retrieve value from a multi dimensional array or default if key not exists
 *
 * @param array $input
 * @param array $key_list
 * @param mixed $default
 * @return mixed
 */
function mda_helper(array $input, array $key_list, $default) {
    foreach ($key_list as $key) {
        if (!array_key_exists($key, $input)) {
            return $default;
        }
        $input = $input[$key];
    }
    return $input;
}
$request = [
    'controller' => [
        'options' => [
            'data' => [
                //'source' => 'foo'
            ]
        ]
    ]
];
$default = 'something';
$source = mda_helper($request, ['controller', 'options', 'data', 'source'], $default);

从PHP 7开始,使用"null coalesce"。"isset ternary")操作符:

$source = ($request['controller']['options']['data']['source'] ?? $default)

  $source = null;
    $default = 'something';
    if(isset($request['controller']['options']['data']['source']) && !empty($request['controller']['options']['data']['source'])) {
        $source = $request['controller']['options']['data']['source'];
    } else {
        $source = $default;
    }