isset() 和PHP数组

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;

再看看这个:

    

        

            

        

    

            

echo 'when $arr like array';
            echo "\n";
            $arr['a'] = "A";
            $arr['a']['b'] = "B";
            
            echo '$arr is array ? '.is_array($arr);
            echo "\n";
            echo '$arr["a"] is array ? '.is_array($arr['a']);
            echo "\n";
            
            echo isset($arr['a']['c']);
            echo "\n";
            echo $arr['a'];
            echo "\n";
            echo $arr['a']['c'];
            echo "\n";
            
            echo 'when $a is string';
            echo "\n";
            $a = 'abcde';
            echo 'isset($a["c"]):'.isset($a['c']);
            echo "\n";
            echo $a['c'];
            echo "\n";
            
            echo 'when $a is array';
            echo "\n";
            $a = array('a' =>'A');
            echo 'isset($a["c"]):'.isset($a['c']);
            echo "\n";
            echo $a['c'];
            
            
            
            exit;

            

 

输出:

———-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 是数组,就打错特错了

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据