PHP中原来有人使用empty函数时就没有考虑到数字0也是empty的,单凭简单的“认为”就难免会出一些意想不到的bug,于是我就倾向于使用isset函数,没想到isset函数也有我想不到的情况,举个例子:
<?php
$arr[‘a’] = "A";
$arr[‘a’][‘b’] = "B"; //这时 $arr[‘a’] = "A"; 已经被覆盖了,
echo isset($arr[‘a’][‘c’]);
?>
输出为:
1
怎么回事呢?
测试发现,不但isset($arr[‘a’][‘c’]) 为真,如果echo $arr[‘a’][‘c’]; 的话,结果还是B呢!
因为在php这种弱类型语言中,key ‘c’ 不存在时,试图转换为数字索引了,转换后就是索引0了,而key ‘b’ 对应的数字索引就是0,所以$arr[‘a’][‘c’] 就成 $arr[‘a’][‘b’] 了,但是如果用is_array()测试,我们将发现$arr 是数组,而$arr[‘a’] 不是数组,所以用array_key_exists() 来查找$arr[‘a’] 中的key ‘b‘ 是否存在的话讲返回false;
再看看这个:
|
输出:
———-PHP代码调试 ———-
when $a like array
$arr is array ? 1
$arr["a"] is array ?
1
B
B
when $a is string
isset($a["c"]):1
a
when $a is array
isset($a["c"]):
输出完成 (耗时 0 秒) – 正常终止
其实: 上面混淆的字符串与数组
对于 $arr = array(‘a’=>’A’);
1. $arr 是数组,isset($arr[‘b’]); 为假,用array_key_exists测试key ‘b’ 也是不存在的
2. $arr[‘a’] 是字符串,isset($arr[‘a’][‘b’]); 则’b’视为字符串的下标(不是数组的下标),一定要转成数字,于是转成了0,于是$arr[‘a’][‘b’]就是存在的了,不妨测试一下,如果$arr[‘a’] 为”,则isset($arr[‘a’][‘b’]); 就为假了。而且因为$arr[‘a’]根本就不是数组,所以用array_key_exists测试key ‘b’ 肯听返回false了。
结论:所以isset没有问题,array_key_exists 也没有问题,问题就在于把字符串与数组 混淆了
不管$arr 原来是什么,只要$arr和一个下标一个被赋值了(如:$arr[‘a’] = ‘A’;)那么$arr 就是数组;
但是,如果因为$arr 可以和一个下标一起使用,就说明$arr 是数组,就打错特错了