Php isset()的反直觉行为

Php isset()的反直觉行为,php,Php,我将变量$foo传递给函数。此输入变量可能是数组或字符串。如果是数组,则我要设置: $name = $foo['name'] $name = $foo 如果它是一个字符串,那么我想设置: $name = $foo['name'] $name = $foo 为此,我编写了以下代码: $name = isset($foo['name']) ? $foo['name'] : $foo 不幸的是,这不起作用。 原因:当$foo是字符串时,isset($foo['name'])返回TRUE 这种

我将变量$foo传递给函数。此输入变量可能是数组或字符串。如果是数组,则我要设置:

$name = $foo['name']
$name = $foo
如果它是一个字符串,那么我想设置:

$name = $foo['name']
$name = $foo
为此,我编写了以下代码:

$name = isset($foo['name']) ? $foo['name'] : $foo
不幸的是,这不起作用。
原因:当$foo是字符串时,isset($foo['name'])返回TRUE

这种行为令我吃惊。我本来希望isset($foo['name'])返回FALSE,因为$foo['name']未设置。有人能解释这种看似违反直觉的行为吗?或者建议一种替代isset()的方法,当$foo是字符串时,它在$foo['name']上返回FALSE

更新: 见下面克里斯托弗的建议:

$name = ( is_array( $foo ) && isset( $foo['name'] ) ) ? $foo['name'] : $foo;

isset
中的
set
并不意味着“一组项目”,它的意思是“它被分配给了什么”。因此,正如您在问题中所说,请改用
is_array
。如果你意识到你可以在没有设置的情况下完成你想要的,为什么不这样做呢


看。

这一点也不奇怪

当$foo是字符串时,为什么它的计算结果为true:$foo['name']与当$foo是字符串时要求它的第零个字符是一样的,因为在该上下文中,'name'或'camel'或'cigar'或'any other string'将强制为整数值

数组_key_exists()也可能不是您想要的,因为如果设置了该键,即使该键的值为null,它也会返回true

in_array()也不好,因为它会毫无怨言地安静地搜索字符串或数组

相反,请考虑:

 $name = ( is_array( $foo ) && isset( $foo['name'] ) ) ? $foo['name'] : $foo;

请注意,如果键“name”的数组和值为null,或者字符串和$foo为null,等等,这并不是语言方面的缺点,而是特定于应用程序的一种逻辑,那么这并没有考虑到您计划执行的任何操作。

非常感谢。这正是我想要的澄清。