什么时候应该在Array上使用isset()而不指定键?

时间:2012-04-23 00:49:12

标签: php arrays language-features

我已经了解到在检查是否存在特定密钥时不需要isset($array),但是我也知道有一些理由可以在没有已知密钥的情况下检查$array是否已实例化。

例如:

foreach ($foo as $bar) {
    echo $bar;
}

PHP注意:未定义的变量:foo
PHP警告:为foreach()提供的参数无效

这样更好:

if (isset($foo)) {
    foreach ($foo as $bar) {
    echo $bar;
    }
}

由于我在处理数据时使用了很多数组,我想问一下是否还有其他情况需要检查整个数组isset()?或者我应该坚持检查我将要使用的每个$array[$key]? 这涉及到这样做是否有任何优点或缺点的问题:

if (isset($foo[0])) {
    foreach ($foo as $bar) {
        // noop
    }
}

而不是:

if (isset($foo)) {
    foreach ($foo as $bar) {
        // noop
    }
}

那么,如果isset($array)已知,我应该使用isset($array[$key])代替$key吗?

2 个答案:

答案 0 :(得分:15)

在PHP中,isset()是一种特殊形式,而不是一种功能;当您致电isset($ary[$index])时,不必先设置$ary本身。即使使用E_STRICT,呼叫也不会生成警告,因为isset实际上并未尝试访问$ary[$index];它确定$ary未设置并返回false。因此,您不需要先检查数组,以便将isset应用于元素。

你的问题表明你已经知道了,并且想知道你是否有理由这样做。我唯一能想到的就是效率:如果你要检查一个数组中是否存在大量的键,你可以通过先检测数组本身未设置的时间来节省一些工作,然后只是跳过所有在这种情况下,个别密钥检查。

答案 1 :(得分:5)

如果您想知道阵列是否完全定义,请使用isset($array)

如果您想知道是否定义了特定密钥,请使用isset($array[$key])

例如,这完全有效:

$foo = array();
foreach($foo as $bar) {
    // never called because $foo is an empty array
}