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

Sam*_*ala 6 php arrays language-features

我已经知道isset($array)在检查是否存在特定密钥时不需要,但是我也知道有一些理由要检查,如果没有已知密钥,是否$array实例化.

例如:

foreach ($foo as $bar) {
    echo $bar;
}
Run Code Online (Sandbox Code Playgroud)

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

这样更好:

if (isset($foo)) {
    foreach ($foo as $bar) {
    echo $bar;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

if (isset($foo[0])) {
    foreach ($foo as $bar) {
        // noop
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

if (isset($foo)) {
    foreach ($foo as $bar) {
        // noop
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,我应该永远使用isset($array)代替isset($array[$key]),如果$key是已知的?

Mar*_*eed 15

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

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


Amb*_*ber 5

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

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

例如,这是完全有效的:

$foo = array();
foreach($foo as $bar) {
    // never called because $foo is an empty array
}
Run Code Online (Sandbox Code Playgroud)