如何检查变量是否存在,并且在一次扫描中是否为真?

时间:2014-09-23 00:40:42

标签: php

这几乎肯定是this question的重复,但我想我的问题更多是关于常见的惯例/最佳实践,给出答案。

示例:

if(isset($this->_available[$option]['accepts_argument']) && $this->_available[$option]['accepts_argument']) {
  // do something
}

这只是丑陋的。但如果我不做第一次检查,我得到一个PHP通知。我应该确保数组键'accepts_argument'始终存在,并且默认为false?这样我就可以测试它是否属实,而不是测试它是否存在?

我不应该担心丑陋/冗长吗?

我在代码中注意到这种模式很多,只是想知道人们如何处理它。我目前正在使用php 5.4,如果这很重要,但是如果5.5+中有一些我想做的东西,我可以升级它。

由于

1 个答案:

答案 0 :(得分:0)

这是我使用的可以帮助您的功能:

 /** todo handle numeric values
 * @param  array  $array      The array from which to get the value
 * @param  array  $parents    An array of parent keys of the value,
 *                            starting with the outermost key
 * @param  bool   $key_exists If given, an already defined variable
 *                            that is altered by reference
 * @return mixed              The requested nested value. Possibly NULL if the value
 *                            is NULL or not all nested parent keys exist.
 *                            $key_exists is altered by reference and is a Boolean
 *                            that indicates whether all nested parent keys
 *                            exist (TRUE) or not (FALSE).
 *                            This allows to distinguish between the two
 *                            possibilities when NULL is returned.
 */
function &getValue(array &$array, array $parents, &$key_exists = NULL)
{
    $ref = &$array;
    foreach ($parents as $parent) {
        if (is_array($ref) && array_key_exists($parent, $ref))
            $ref = &$ref[$parent];
        else {
            $key_exists = FALSE;
            $null = NULL;
            return $null;
        }
    }
    $key_exists = TRUE;
    return $ref;
}

即使此数组是嵌套的,它也会获取数组中元素的值。如果路径不存在,则返回null。魔术!

示例:

$arr = [
    'path' => [
        'of' => [
            'nestedValue' => 'myValue',
        ],
    ],
];
print_r($arr);
echo getValue($arr, array('path', 'of', 'nestedValue'));
var_dump(getValue($arr, array('path', 'of', 'nowhere')));